Mongo中的大小写不敏感搜索

97

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

即。我正在使用带有选项i的正则表达式。但是我无法将正则表达式限制为仅限该单词,它的表现更像SQL中的“Like”。

例如:如果我使用查询 {"SearchWord" : { '$regex' : 'win', $options: '-i' }},它会显示win、window和winter的结果。如何将其限制为只显示win?

我尝试了/^win$/,但它说是无效的JSON... 请建议一下。

6个回答

201

您可以使用$options => i来进行不区分大小写的搜索。提供一些可能需要用到的字符串匹配的示例。

精确不区分大小写的string

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

包含字符串

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
我已经编辑了你的答案,但它需要同行评审。 - gauravparmar

70

“^win$” 模式在他们的文档中并不是那么明显。这几乎就像是一份细则。所以,谢谢。 - duduwe

24

更新:从 MongoDB 2.4 版本开始,可以使用“text”索引和全文搜索查询来实现此操作。您可以在此处阅读有关它们的更多信息。如果使用最新版本的 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" }
请注意,不区分大小写的查询不使用索引,因此可能有意义创建一个小写的searchword字段,以便您可以加快查询速度。
点击这里了解更多关于正则表达式的信息。

2
$text 不是正则表达式的替代品。它非常严格,不允许使用 "win" 搜索来找到 "winter"。 - B T
@BT 你说得对。为了做到这一点,我们需要存储n-gram并进行匹配。使用MongoDB和Python进行模糊搜索 - tim-phillips
同时:大小写不敏感索引 - tim-phillips

1
{
          $match: {
            $expr: {
              $and: [
                { $eq: ["$_id", "$$itemId"] },
                {
                  $regexMatch: {
                    input: "$brandData.name",
                    regex: "sample",
                    options: "i",
                  },
                },
              ],
            },
          },
        },

-1

-1

对于不区分大小写

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

对于大小写敏感

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

在用户表中搜索

名称是列名,搜索的文本为“Vi”


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接