21

如何在 mongodb 的集合中搜索列,$in其中包含要搜索的元素数组以及caseInsensitive列中这些元素的匹配?

4

6 回答 6

13

使用$in匹配不区分大小写:

数据示例:

{ 
    name : "...Event A",
    fieldX : "aAa" 
},
{ 
  name : "...Event B",
  fieldX : "Bab" 
},
{ 
  name : "...Event C",
  fieldX : "ccC" 
},
{ 
  name : "...Event D",
  fieldX : "dDd" 
}

而我们希望文档被“fieldX”包含在数组的任意值(optValues)中:

var optValues = ['aaa', 'bbb', 'ccc', 'ddd'];

var optRegexp = [];
optValues.forEach(function(opt){
        optRegexp.push(  new RegExp(opt, "i") );
});

db.collection.find( { fieldX: { $in: optRegexp } } );

这也适用于$all

我希望这有帮助!

ps:这是我在 Web 应用程序中按标签搜索的解决方案。

于 2015-10-29T15:21:21.127 回答
12

您可以将$elemMatch与正则表达式搜索一起使用,例如让我们在以下集合中搜索“蓝色”颜色:

db.items.save({ 
  name : 'a toy', 
  colors : ['red', 'BLUE'] 
})
> ok
db.items.find({
  'colors': {
    $elemMatch: { 
      $regex: 'blue', 
      $options: 'i' 
    }
  }
})
>[ 
  {   
    "name": "someitem",
    "_id": { "$oid": "4fbb7809cc93742e0d073aef"},   
    "colors": ["red", "BLUE"]
   }
]
于 2012-05-22T11:19:24.483 回答
3

这对我来说非常有效。

从代码中,我们可以像这样创建自定义查询:

{
  "first_name":{
    "$in":[
      {"$regex":"^serina$","$options":"i"}, 
      {"$regex":"^andreW$","$options":"i"}
    ]
  }
}

这将在查询后转换为 mongo 中的以下内容:

db.mycollection.find({"first_name":{"$in":[/^serina$/i, /^andreW$/i]}})

“$nin”也一样。

于 2017-01-03T09:29:21.060 回答
2

这很简单

const sampleData = [
  RegExp("^" + 'girl' + "$", 'i'),
  RegExp("^" + 'boy' + "$", 'i')
];
const filerObj = { gender : {$in : sampleData}};
于 2019-01-24T06:07:36.620 回答
0

这是我使用过的数组数据中具有多个条件(正则表达式)的不区分大小写$in的搜索(查询),但它不支持不区分大小写的搜索。

示例数据

{ 
  name : "...Event A",
  tags : ["tag1", "tag2", "tag3", "tag4] 
},
{ 
  name : "...Event B",
  tags : ["tag3", "tag2"]
},
{ 
  name : "...Event C",
  tags : ["tag1", "tag4"]
},
{ 
  name : "...Event D",
  tags : ["tag2", "tag4"]
}

我的查询

db.event.find(
  { $or: //use $and or $or depends on your needs
    [ 
      { tags : { 
         $elemMatch : { $regex : '^tag1$', $options : 'i' }
        } 
      },
      { tags : { 
         $elemMatch : { $regex : '^tag3$', $options : 'i' }
        } 
      }
    ]
})
于 2015-03-31T12:01:59.663 回答
-1

在Java中做到这一点的方法是:

List<String> nameList = Arrays.asList(name.split(PATTERN));
List<Pattern> regexList = new ArrayList<>();
for(String name: nameList) {
regexList.add(Pattern.compile(name , Pattern.CASE_INSENSITIVE));
}
criteria.where("Reference_Path").in(regexList);
于 2019-03-12T09:17:06.947 回答