如何在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”开头的所有名字。