如何在Mongodb上进行不区分大小写的查询?

var thename = 'Andrew'; db.collection.find({'name':thename}); 

如何查询不区分大小写? 即使“安德鲁”,我也想find结果。

克里斯·富尔斯托的解决scheme将工作(+1),但是,它可能不是有效的,特别是如果你的collections是非常大的。 非根的正则expression式(不以^开头的正则expression式,它将正则expression式固定到string的开始处),而那些使用i标志来区分大小写的正则expression式不会使用索引,即使它们存在。

您可能考虑的另一个select是将数据非规范化,以存储name字段的小写版本,例如name_lower 。 然后,您可以有效地查询(特别是如果它是索引)的不区分大小写的精确匹配,如:

 db.collection.find({"name_lower": thename.toLowerCase()}) 

或者用前缀匹配(根源正则expression式)为:

 db.collection.find( {"name_lower": { $regex: new RegExp("^" + thename.toLowerCase(), "i") } } ); 

这两个查询都将在name_lower上使用一个索引。

你需要使用这个不区分大小写的正则expression式 ,例如

 db.collection.find( { "name" : { $regex : /Andrew/i } } ); 

要从您的名称variables使用正则expression式模式,构build一个新的RegExp对象:

 var thename = "Andrew"; db.collection.find( { "name" : { $regex : new RegExp(thename, "i") } } ); 

更新:对于完全匹配,你应该使用正则expression式"name": /^Andrew$/i 。 感谢Yannick L.

我已经解决了这个问题

  var thename = 'Andrew'; db.collection.find({'name': {'$regex': thename,$options:'i'}}); 

如果你想查询“不区分大小写的精确匹配”,那么你可以这样做。

 var thename = '^Andrew$'; db.collection.find({'name': {'$regex': thename,$options:'i'}}); 

我刚刚在几个小时前解决了这个问题。

 var thename = 'Andrew' db.collection.find({ $text: { $search: thename } }); 
  • 在进行查询时,区分大小写和变音敏感度默认设置为false。

你甚至可以通过这样的方式来select你需要的来自Andrew的用户对象的字段:

 db.collection.find({ $text: { $search: thename } }).select('age height weight'); 

参考: https : //docs.mongodb.org/manual/reference/operator/query/text/#text

MongoDB 3.4现在包含了一个真正的不区分大小写索引的能力,这将大大提高大数据集不区分大小写查询的速度。 这是通过指定一个强度为2的sorting规则。

可能最简单的方法是在数据库上设置一个sorting规则。 然后所有的查询都inheritance这个sorting规则,并使用它:

 db.createCollection("cities", { collation: { locale: 'en_US', strength: 2 } } ) db.names.createIndex( { city: 1 } ) // inherits the default collation 

你也可以这样做:

 db.myCollection.createIndex({city: 1}, {collation: {locale: "en", strength: 2}}); 

像这样使用它:

 db.myCollection.find({city: "new york"}).collation({locale: "en", strength: 2}); 

这将返回名为“纽约”,“纽约”,“纽约”等城市。

欲了解更多信息: https : //jira.mongodb.org/browse/SERVER-90

以下查询将查找所需的string不敏感和全局发生的文档

 db.collection.find({name:{ $regex: new RegExp(thename, "ig") } },function(err, doc) { //Your code here... }); 

查找不区分大小写的文字string:

使用正则expression式(推荐)

 db.collection.find({ name: { $regex: new RegExp('^' + name.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&') + '$', 'i') } }); 

使用小写索引(更快)

 db.collection.find({ name_lower: name.toLowerCase() }); 

正则expression式比文字string匹配慢。 但是,额外的小写字段会增加您的代码复杂性。 如有疑问,请使用正则expression式。 我build议只使用一个明确的小写字段,如果它可以replace你的字段,也就是说,你不关心这个案例。

请注意,您需要在正则expression式之前转义该名称。 如果你想要用户input的通配符,在转义之后更愿意追加.replace(/%/g, '.*') ,这样你就可以匹配“a%”来find以“a”开头的所有名字。