RegEx для сопоставления строк MongoDB - PullRequest
2 голосов
/ 26 мая 2019

Я использую мангуста и имею большое количество таких объектов:

{
"_id" : ObjectId("5bfeb4aa0a49bf3d84d885b5"),
"category" : [ 
    "Cult", 
    "Space Opera"
],
"actors" : [ 
    "David Prowse in the role of Darth Vader", 
    "Mark Hamill as Luke Skywalker", 
    "Carrie Fisher as Leia Organa", 
    ...
],
"title" : "Star Wars",
"description" : ".....",
"rating" : 4.65,
"__v" : 0

}

Мне нужно найти все фильмы, которые соответствуют моему массиву актеров

например: ["David Prowse", "Mark Hamill", "Carrie Fisher"]

При использовании этого массива один из фильмов должен быть Звездные войны , но в объекте фильма нет чистых имен актеров, поэтому, вероятно, его необходимо сопоставить срегулярное выражение или что-то подобное для сопоставления по подстроке (без учета регистра).

Мой фактический запрос всегда возвращает пустой массив документов ----------

let arrayOfqueries = [];

    for (let i = 0; i < arrayOfActors.length; i++) {
        arrayOfqueries.push({$regex: ".*" + arrayOfActors[i] + ".*", $options: "i"});
    }

    Utils.searchFilms({
        "actors": {
            "$all": arrayOfqueries
        }
    }).then((docs) => {
        console.log(docs)
    }).catch((err) => {
        console.log(err);
    });

Ответы [ 2 ]

2 голосов
/ 26 мая 2019

Ваше регулярное выражение должно быть

for (let i = 0; i < arrayOfActors.length; i++) {
  arrayOfqueries.push(new RegExpr("\b" + arrayOfActors[i] + "\b"))
}
1 голос
/ 26 мая 2019

Я предполагаю, что здесь может быть достаточно простой группы захвата.Тогда, основываясь на решении Fanpark, ваш код может выглядеть следующим образом:

for (let i = 0; i < arrayOfActors.length; i++) {
  arrayOfqueries.push(new RegExpr("(" + arrayOfActors[i] + ")"))
}

Если это не сработало, мы можем попробовать другие выражения, такие как:

(?:[\s\S]*)(David Prowse)(?:[\s\S]*)

, и наш код может выглядетькак:

arrayOfqueries.push(new RegExpr("(?:[\s\S]*)(" + arrayOfActors[i] + ")(?:[\s\S]*)"))

Кроме того, метасхемы должны быть экранированы.

DEMO

...