MongoDB使用regex数组元素查询$ in

时间:2016-02-10 16:43:23

标签: arrays regex mongodb

好的我正在尝试实现一个查询,它试图在一堆文件上执行正则表达式搜索(包含数组列表)

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

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

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 }});

6 个答案:

答案 0 :(得分:8)

当双引号存在时它不起作用,因为它们被解释为字符串而不是RegExp个对象。因此,要使其工作,您必须首先在Javascript中将其转换为RegExp个对象。

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

答案 1 :(得分:5)

使用 $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" }

答案 2 :(得分:1)

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

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);
        })
    }
});

答案 3 :(得分:1)

对我来说似乎很好,请尝试此操作

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

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

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

答案 4 :(得分:0)

这是转换/.*/ style regex的简单方法。

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}});

答案 5 :(得分:0)

根据 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 } });