在Mongo中组合$ regex和$或运算符

时间:2014-08-07 08:27:42

标签: regex mongodb mongodb-query

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

3 个答案:

答案 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 } } ] })