我想同时使用$or
和$regex
运算符。
db.users.insert([{name: "Alice"}, {name: "Bob"}, {name: "Carol"}, {name: "Dan"}, {name: "Dave"}])
使用$regex
可以正常工作:
> db.users.find({name: {$regex: "^Da"}})
{ "_id" : ObjectId("53e33682b09f1ca437078b1d"), "name" : "Dan" }
{ "_id" : ObjectId("53e33682b09f1ca437078b1e"), "name" : "Dave" }
在介绍$or
时,响应会发生变化。我期待同样的回应:
> db.users.find({name: {$regex: {$or: ["^Da"]}}})
{ "_id" : ObjectId("53e33682b09f1ca437078b1a"), "name" : "Alice" }
{ "_id" : ObjectId("53e33682b09f1ca437078b1b"), "name" : "Bob" }
{ "_id" : ObjectId("53e33682b09f1ca437078b1c"), "name" : "Carol" }
{ "_id" : ObjectId("53e33682b09f1ca437078b1d"), "name" : "Dan" }
{ "_id" : ObjectId("53e33682b09f1ca437078b1e"), "name" : "Dave" }
我也试图改变运营商的顺序:
> db.users.find({name: {$or: [{$regex: "^Da"}, {$regex: "^Ali"}]}})
error: { "$err" : "invalid operator: $or", "code" : 10068 }
然而,以下查询似乎工作正常,但它有点长(name
重复):
> db.users.find({$or: [{name: {$regex: "^Da"}}, {name: {$regex: "^Ali"}}]})
{ "_id" : ObjectId("53e33682b09f1ca437078b1a"), "name" : "Alice" }
{ "_id" : ObjectId("53e33682b09f1ca437078b1d"), "name" : "Dan" }
{ "_id" : ObjectId("53e33682b09f1ca437078b1e"), "name" : "Dave" }
在这样的查询中使用$regex
和$or
是否有更简短的方法?
目标是使用$regex
运算符,而不是/.../
(真正的正则表达式)。
答案 0 :(得分:20)
$or
运算符需要整个条件,因此正确的格式为:
db.users.find({ "$or": [
{ "name": { "$regex": "^Da"} },
{ "name": { "$regex": "^Ali" }}
]})
当然还是使用$in
:
db.users.find({ "name": { "$in": [/^Da/,/^Ali/] } })
但它是一个正则表达式,所以你可以这样做:
db.users.find({ "name": { "$regex": "^Da|^Ali" } })
答案 1 :(得分:0)
已经有一段时间了。但是,我将对正则表达式查询添加不区分大小写的内容,例如以下查询。因此,名称是否以大写字母保存到数据库中都没关系:
db.users.find({ "name": { "$regex": "^Da|^Ali", "$options": "i" } })
希望有帮助
答案 2 :(得分:0)
似乎当您基于 $and 或 $or 和多个搜索并使用至少一个 $regex 时,您必须对所有条件使用 $regex。 第一个从下面工作正常,第二个更像 $or 运算符。
db.big_data.users.find(
{ $and: [
{ sex: { $regex: /^M.*/ } },
{ name: { $regex: /^J.*/ } }
] })
db.big_data.users.find({ $and: [ {sex: "M"}, { name: { $regex: /^J*/m } } ] })