Mongo中不区分大小写的搜索


70

我在Mongo中使用不区分大小写的搜索,类似于https://stackoverflow.com/q/5500823/1028488

即我正在使用带有选项i的正则表达式。但是我在将正则表达式限制为该单词时遇到了麻烦,它的执行效果更像SQL中的“ Like”

例如:如果我使用类似的查询 {"SearchWord" : { '$regex' : 'win', $options: '-i' }},它将向我显示胜利,窗户和冬季的结果。我如何将其限制为jsut show win?

我尝试过,/^win$/但是说无效的杰森...。请提出一种方法。

提前致谢

Answers:



139

您可以$options => i用于不区分大小写的搜索。给出一些字符串匹配所需的示例。

完全不区分大小写 string

db.collection.find({name:{'$regex' : '^string$', '$options' : 'i'}})

包含 string

db.collection.find({name:{'$regex' : 'string', '$options' : 'i'}})

从...开始 string

db.collection.find({name:{'$regex' : '^string', '$options' : 'i'}})

结束于 string

db.collection.find({name:{'$regex' : 'string$', '$options' : 'i'}})

不包含 string

db.collection.find({name:{'$regex' : '^((?!string).)*$', '$options' : 'i'}})

将其保留为书签,并作为您可能需要的其他更改的参考。 http://www.cheatography.com/davechild/cheat-sheets/regular-expressions/


您错误地将“包含字符串”的示例放在“不区分大小写的精确字符串”中,反之亦然。我通过交换这两种情况的示例来编辑您的答案,并且还纠正了一些语法错误。
gauravparmar

@gauravparmar:请检查并更正是否有错误。
Somnath Muluk '18

它说,我已经编辑了您的答案,但必须经过同行评审。
gauravparmar

21

更新:从MongoDB 2.4开始,将使用“文本”索引和全文搜索查询来执行此操作。您可以在这里阅读有关它们的信息。如果使用最新的MongoDB,则以下方法将是愚蠢且不必要的。

但是,如果MongoDB <2.4.0,则可以使用如下正则表达式:

> db.reg.insert({searchword: "win"})
> db.reg.insert({searchword: "window"})
> db.reg.insert({searchword: "Win"})

> db.reg.find()
{ "_id" : ObjectId("4ecd2e33dd68c9021e453d12"), "searchword" : "win" }
{ "_id" : ObjectId("4ecd2e36dd68c9021e453d13"), "searchword" : "window" }
{ "_id" : ObjectId("4ecd2e39dd68c9021e453d14"), "searchword" : "Win" }

> db.reg.find({ searchword: /^win$/i })
{ "_id" : ObjectId("4ecd2e33dd68c9021e453d12"), "searchword" : "win" }
{ "_id" : ObjectId("4ecd2e39dd68c9021e453d14"), "searchword" : "Win" }

但是,您的版本无法正常工作,因为使用$ regex运算符时不需要“ /”:

> db.reg.find({ searchword: { $regex: "^win$", $options: '-i' }})
{ "_id" : ObjectId("4ecd2e33dd68c9021e453d12"), "searchword" : "win" }
{ "_id" : ObjectId("4ecd2e39dd68c9021e453d14"), "searchword" : "Win" }

请注意,不区分大小写的查询不使用索引,因此使用小写搜索词字段可能有意义,这样可以加快查询速度。

转到此处以获取有关RegularExpressions的更多信息


2
$ text不能代替正则表达式。这是非常严格的限制,不允许他通过搜索“胜利”来找到“冬天”。
BT

@BT你是对的。为了做到这一点,必须存储n-gram并对其进行匹配。使用MongoDB和Python进行模糊搜索
Rohmer



-1

不区分大小写

db.users.find({"name":{ $regex : new RegExp("Vi", "i") }})

区分大小写

db.users.find({"name":"Vi"})
// or
db.users.find({"email":"example@mail.com"})

在用户表中搜索

名称是所搜索的列名称和“ Vi”文本

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.