正则表达式用于匹配MongoDB字符串

时间:2019-05-26 11:48:34

标签: regex mongodb mongoose mongodb-query regex-lookarounds

我正在使用猫鼬,并且有很多这样的对象:

{
"_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 个答案:

答案 0 :(得分:2)

您的正则表达式应为

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

答案 1 :(得分:1)

我猜想这里一个简单的捕获小组就足够了。然后,基于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