mongodb 在Mongo中组合$regex和$or运算符

oxalkeyp  于 2023-01-16  发布在  Go
关注(0)|答案(4)|浏览(146)

我想同时使用$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运算符,而不是/.../(真实的正则表达式)。

2uluyalo

2uluyalo1#

$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" } })
nsc4cvqm

nsc4cvqm2#

已经有一段时间了,但是,我会在正则表达式查询中添加大小写不敏感,就像下面的查询一样,这样,名称是否以大写字母保存到数据库中就没有关系了:

db.users.find({ "name": { "$regex": "^Da|^Ali", "$options": "i" } })

希望能有所帮助

qojgxg4l

qojgxg4l3#

似乎当你有$和或$或和多个搜索为基础,并使用至少一个$regex你必须使用$regex的所有条件。第一次从下面的作品OK,第二次更像$或运算符。

db.big_data.users.find(
    { $and: [ 
       { sex: { $regex: /^M.*/ } },
       { name: { $regex: /^J.*/ } } 
    ] })

db.big_data.users.find({ $and: [ {sex: "M"}, { name: { $regex: /^J*/m } } ] })
btqmn9zl

btqmn9zl4#

您可以使用OR运算符,如

db.collName.find({ "name": { "$regex": "^Da|^Ali" ,"$options": "i" } })

和运算符

db.collName.find({ "name": { "$regex": "Ali" ,"$options": "i" } })

更多信息来源-https://www.cs.jhu.edu/~jason/405/lectures1-2/sld049.htm

相关问题