Mongo中不区分大小写的搜索

时间:2011-11-23 16:53:01

标签: regex mongodb pattern-matching match case-insensitive

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

即我正在使用带有选项i的正则表达式。但是我在将正则表达式限制在那个词时遇到了麻烦,它的表现更像是SQL中的“喜欢”

例如:如果我使用查询 {"SearchWord" : { '$regex' : 'win', $options: '-i' }},它显示了win,window&的结果冬季。我如何将其限制为jsut show win?

我试过了/^win$/,但它说无效的Json ....请建议一个方法。

提前致谢

6 个答案:

答案 0 :(得分:89)

您可以使用$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/

答案 1 :(得分:47)

您可以使用'$regex':'^win$'/^win$/i(注意第二个没有引用)

来源:Regex in queries with Mongo

答案 2 :(得分:18)

更新:从MongoDB 2.4开始,人们会使用" text"索引和全文搜索查询来执行此操作。你可以阅读它们here。如果使用最近的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运算符时您不需要" /" s

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

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

转到here了解有关RegularExpressions的更多信息

答案 3 :(得分:0)

使用$ strcasecmp。聚合框架是在MongoDB 2.2中引入的。您可以使用字符串运算符“$ strcasecmp”在字符串之间进行不区分大小写的比较。它比使用正则表达式更值得推荐和使用。

以下是聚合命令运算符的官方文档:https://docs.mongodb.com/manual/reference/operator/aggregation/strcasecmp/#exp._S_strcasecmp

答案 4 :(得分:0)

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

答案 5 :(得分:-2)

对于不区分大小写 db.users.find({“name”:{$ regex:new RegExp(“Vi”,“i”)}})

区分大小写 db.users.find({ “名”: “VI”}) 要么 db.users.find({ “电子邮件”: “example@mail.com”})

在用户表中搜索<​​/ p>

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