我在Mongo中使用不区分大小写的搜索,类似于https://stackoverflow.com/q/5500823/1028488。
即我正在使用带有选项i的正则表达式。但是我在将正则表达式限制在那个词时遇到了麻烦,它的表现更像是SQL中的“喜欢”
例如:如果我使用查询
{"SearchWord" : { '$regex' : 'win', $options: '-i' }}
,它显示了win,window&的结果冬季。我如何将其限制为jsut show win?
我试过了/^win$/
,但它说无效的Json ....请建议一个方法。
提前致谢
答案 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
(注意第二个没有引用)
答案 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”文本