使用AND和OR进行mongodb查询

使用AND和OR进行mongodb查询,mongodb,Mongodb,我可以在mongodb查询中结合使用OR和and吗 下面的代码无法按预期工作 db.things.find({ $and:[ {$or:[ {"first_name" : "john"}, {"last_name" : "john"} ]}, {"phone": "12345678"}

我可以在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"}]});
>

我使用的是Mongo1.8.3,我相信$,并且只在MongoDB v2.0+中受支持。我很惊讶控制台一开始就接受了这个表达。我将尝试在现有的1.8服务器上重新创建

还要检查
$和

更新

我将您的示例数据输入到v1.8x和v2.0x MongoDB服务器中。查询在v2.0x上工作,在v1.8x上失败。这证实了我(和Miikka)的怀疑,即问题出在
$和
以及您的服务器版本上

我在网上找到了一个(可以说)聪明的解决方法。我希望这有帮助


-SethO

这可以通过以下方式实现(mongodb 3.4)

这是一个很好的例子

db.getCollection('tbl_菜单项')。查找({ 美元及:[ {$or:[{price:0.99},{price:1.99}]}, {$or:[{sale:true},{qty:{$lt:20}]} ] } ) 此查询将选择所有文档,其中:

价格字段值等于0.99或1.99,并且 销售字段值等于true或数量字段值小于20

下面是$and条件与$or查询的示例,例如匹配任何条件

考虑以下查询

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 } ] } ] } ) db.getCollection('tbl_菜单项')。查找( {'$or': [{'$and': [{位置:{'$in':[ObjectId(“588054c63879f2e767a1d553”)]}, {is_ryward:1}, {兑换奖励所需积分:{$lte:500}}, {'$and': [{位置:{'$in':[ObjectId(“588054c63879f2e767a1d553”)]}, {是免费的:1}]} ) 此查询将选择所有文档,其中:

588054c63879f2e767a1d553中的位置阵列,且为1,兑换奖励所需积分<500

588054c63879f2e767a1d553中的位置阵列,是免费的

 db.things.find( {
      $and : [
               { 
                 $or : [ 
                         {"first_name" : "john"},
                         {"last_name" : "john"}
                       ]
               },
               { 
                 "Phone":"12345678"
               }
             ]
    } )
采用两个表达式的数组或电话。
接受由两个表达式组成的数组first\u name和last\u name

    • 名字
  • 电话号码


注意:如果此操作不起作用,请升级到MongoDB的最新版本。

使用隐式AND操作的时间更短:

db.things.find({
    $or : [ 
        {"first_name": "john"},
        {"last_name": "john"}
    ],
    "phone": "12345678"         
})

我猜这是您运行的旧版本MongoDB的一个问题。您的查询似乎适用于2.0.6。
db.things.find({
    $or : [ 
        {"first_name": "john"},
        {"last_name": "john"}
    ],
    "phone": "12345678"         
})