我想同时使用$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
运算符,而不是/.../
(真实的正则表达式)。
4条答案
按热度按时间2uluyalo1#
$or
运算符需要完整的条件,因此正确的形式应为:当然也可以使用
$in
:但它是一个正则表达式所以你可以:
nsc4cvqm2#
已经有一段时间了,但是,我会在正则表达式查询中添加大小写不敏感,就像下面的查询一样,这样,名称是否以大写字母保存到数据库中就没有关系了:
希望能有所帮助
qojgxg4l3#
似乎当你有$和或$或和多个搜索为基础,并使用至少一个$regex你必须使用$regex的所有条件。第一次从下面的作品OK,第二次更像$或运算符。
btqmn9zl4#
您可以使用OR运算符,如
和运算符
更多信息来源-https://www.cs.jhu.edu/~jason/405/lectures1-2/sld049.htm