【问题标题】:Combining $regex and $or operators in Mongo在 Mongo 中结合 $regex 和 $or 运算符
【发布时间】:2014-09-30 09:46:37
【问题描述】:

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

【问题讨论】:

  • FWIW,您可以(并且可能应该)在正则表达式中执行 or^(?:Da|Ali).

标签: regex mongodb mongodb-query


【解决方案1】:

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

【讨论】:

  • 如果我不在查询周围加上双引号,为什么正则表达式(最后一个)不起作用? ("^Da|^Ali") 和使用 $in 作为 /pattern/ 而不是只使用正则表达式有什么区别?
【解决方案2】:

已经有一段时间了。但是,我会添加不区分大小写的正则表达式查询,如下面的查询。因此,名称是否以大写字母保存到数据库中并不重要:

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

希望对你有帮助

【讨论】:

  • 如果您打算索引名称字段,您会发现一旦您包含不区分大小写的选项,mongo 就不会使用索引 - 最好将名称存储为小写并确保您的术语是小写的
【解决方案3】:

似乎当您基于 $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 } } ] })

【讨论】:

    猜你喜欢
    • 2015-07-08
    • 2020-12-17
    • 2012-11-03
    • 2015-03-16
    • 2016-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-09
    相关资源
    最近更新 更多