【问题标题】:MongoDB query $in with regex array of element使用正则表达式元素数组的 MongoDB 查询 $in
【发布时间】: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 }});

【问题讨论】:

    标签: arrays regex mongodb


    【解决方案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 } });
            

            【讨论】:

              猜你喜欢
              • 2022-01-18
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-11-05
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多