使用正则表达式元素数组的 MongoDB 查询 $in

Posted

技术标签:

【中文标题】使用正则表达式元素数组的 MongoDB 查询 $in【英文标题】:MongoDB query $in with regex array of element 【发布时间】:2016-05-21 03:32:08 【问题描述】:

好的,我正在尝试实现一个查询,该查询正在尝试对一堆文档执行正则表达式搜索(其中包含一个数组列表)

我很难解释......所以我基本上是直接点。

有一个查询适用于正则表达式数组...

db.paper.find("category": $in: [ /xd/, /sd/, /ad/ ] )

存在不适用于正则表达式数组的查询...

db.paper.find("category": $in: [ "/xd/", "/sd/", "/ad/" ] )

所以基本上我想要的是从字符串数组中删除“”符号......这样我就可以执行下面的查询......

var sea = [ "/xd/", "/sd/", "/ad/" ];
db.paper.find("category": $in: sea );

【问题讨论】:

【参考方案1】:

当双引号出现时它不起作用,因为它们被解释为字符串而不是RegExp 对象。因此,要使其正常工作,您必须先将其转换为 RegExp 像这样在 javascript 中的对象。

var sea = [ "xd", "sd", "ad" ]; // Note: no slashes
var regex = [];
for (var i = 0; i < sea.length; i++) 
    regex[i] = new RegExp(sea[i]);

db.paper.find("category": $in: regex);

记住,MongoDB shell 使用 Javascript

【讨论】:

如何在spring boot应用中使用MongoTemplate实现【参考方案2】:

使用 $in 对于小型数组可能相当有效,但对于大型列表则不是那么好,因为它会在索引中跳过以查找匹配的文档,或者如果存在则遍历整个集合不是要使用的索引。

除了using the $in with the regular expression,您还可以使用管道分隔的正则表达式模式和关键字列表,如下所示:

测试文档:

db.papertest.insert([
     category: "ad bd cd" ,
     category: "dd ed fd" ,
     category: "gd hd id" ,
     category: "jd kd ld" ,
     category: "md nd od" ,
     category: "pd qd rd" ,
     category: "sd td ud" ,
     category: "vd wd xd yd zd" ,
]);

魔法:

var keywords = ["xd", "sd", "ad"],
    regex = keywords.join("|");

db.papertest.find(
    "category": 
        "$regex": regex, 
        "$options": "i"
     
);

结果

 "_id" : ObjectId("56bb6f171bb4f693057c0ba4"), "category" : "ad bd cd" 
 "_id" : ObjectId("56bb6f171bb4f693057c0baa"), "category" : "sd td ud" 
 "_id" : ObjectId("56bb6f171bb4f693057c0bab"), "category" : "vd wd xd yd zd" 

【讨论】:

【参考方案3】:

这是转换 /.*/ 样式正则表达式的简单方法。

var sea = [ "/xd/", "/sd/", "/ad/" ];

var rx = [];
sea.forEach(function name(value) 
    var v = value.replace(/\//ig,"");
    rx.push(new RegExp(v));
);

db.paper.find("category": $in: rx);

【讨论】:

【参考方案4】:

为此,您可以为数组中的每个项目添加一个正则表达式,您可以通过以下方式进行。

data = ['hoLA','Que','TAL', 'Nueva'];
data  = data.map(function(v, i)return new RegExp(v, 'i'));
MyCollection.find("thing": $in : data, function(err, data)
    if (err) 
        console.log(err)
    else
        data.forEach(function(item)
            console.log(item.nombre);
        )
    
);

【讨论】:

【参考方案5】:

这对我来说似乎工作正常,请试试这个

var sea = [ "xd", "sd", "ad" ];

var regex = sea.map( function( val ) 
        return new RegExp( '^['+val+'].*','i' ); 
    ) 

db.paper.find("category":  $in: regex );

【讨论】:

【参考方案6】:

根据 Meme Composer 评论略微改进了 ES6 + TypeScript 答案:

const sea: string[] = [ "xd", "sd", "ad" ];
const regex: RegExp[] = sea.map((value) => new RegExp(value));

db.paper.find( "category":  $in: regex  );

【讨论】:

以上是关于使用正则表达式元素数组的 MongoDB 查询 $in的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB:使用正则表达式聚合数组元素

mongodb 正则表达式查询性能问题

Java对mongodb进行正则查询?

MongoDB(课时14 正则运算)

MongoDB,通过正则表达式对索引字段的查询性能

Mongodb数据库的模糊搜索