我可以在mongodb查询中使用OR和AND的组合吗?
以下代码无法按预期工作
db.things.find({
$and:[
{$or:[
{"first_name" : "john"},
{"last_name" : "john"}
]},
{"phone": "12345678"}
]});
数据库内容:
> db.things.find();
{ "_id" : ObjectId("4fe8734ac27bc8be56947d60"), "first_name" : "john", "last_name" : "hersh", "phone" : "2222" }
{ "_id" : ObjectId("4fe8736dc27bc8be56947d61"), "first_name" : "john", "last_name" : "hersh", "phone" : "12345678" }
{ "_id" : ObjectId("4fe8737ec27bc8be56947d62"), "first_name" : "elton", "last_name" : "john", "phone" : "12345678" }
{ "_id" : ObjectId("4fe8738ac27bc8be56947d63"), "first_name" : "eltonush", "last_name" : "john", "phone" : "5555" }
查询上述查询时 - 我什么都没得到!
> db.things.find({$and:[{$or:[{"first_name" : "john"}, {"last_name" : "john"}]},{"phone": "12345678"}]});
>
我正在使用mongo 1.8.3
答案 0 :(得分:13)
db.things.find( {
$and : [
{
$or : [
{"first_name" : "john"},
{"last_name" : "john"}
]
},
{
"Phone":"12345678"
}
]
} )
AND 采用两个表达式 OR ,手机的数组。
OR 采用2个表达式first_name,last_name的数组。
AND
或
电话号码。
注意:如果不起作用,请升级到最新版本的MongoDB。
答案 1 :(得分:9)
我相信$并且只支持MongoDB v2.0 +。我很惊讶控制台首先接受了这个表达方式。我将尝试重新创建一台1.8服务器。
同时检查$and
$and
。
更新
我将您的示例数据输入到v1.8x和v2.0x MongoDB服务器中。该查询适用于v2.0x,并且在v1.8x上失败。这证实了我(和Miikka)怀疑问题出在{{1}}和您的服务器版本。
我在网上10Gen's Advanced Query Documentation找到了一个(可以说是)聪明的解决方法。我希望这会有所帮助。
-SethO
答案 2 :(得分:9)
这可以通过以下方式实现(mongodb 3.4)
这是一个很好的例子
db.getCollection('tbl_menu_items').find({ $and : [ { $or : [ { price : 0.99 }, { price : 1.99 } ] }, { $or : [ { sale : true }, { qty : { $lt : 20 } } ] } ] } )
此查询将选择以下所有文档:
价格字段值等于0.99或1.99,并且 销售字段值等于true或qty字段值小于20.
以下是带有$或查询的$和condition的示例,例如匹配任何条件
考虑以下查询...
db.getCollection('tbl_menu_items').find( { '$or': [ { '$and': [ { location: { '$in': [ ObjectId("588054c63879f2e767a1d553") ] } }, { is_ryward: 1 }, { points_reqiured_to_redeem_reward: { '$lte': 500 } } ] }, { '$and': [ { location: { '$in': [ ObjectId("588054c63879f2e767a1d553") ] } }, { is_freebie: 1 } ] } ] } )
此查询将选择以下所有文档:
588054c63879f2e767a1d553中的位置数组和is_ryward = 1以及points_reqiured_to_redeem_reward< 500
或者
位置数组在588054c63879f2e767a1d553和is_freebie
答案 3 :(得分:3)
避免使用隐式AND运算:
db.things.find({
$or : [
{"first_name": "john"},
{"last_name": "john"}
],
"phone": "12345678"
})