mongodb使用AND和OR查询

时间:2012-06-25 19:33:06

标签: mongodb

我可以在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

4 个答案:

答案 0 :(得分:13)

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

AND 采用两个表达式 OR ,手机的数组。
OR 采用2个表达式first_name,last_name的数组。

AND

    • first_name
    • 姓氏
  • 电话号码。

注意:如果不起作用,请升级到最新版本的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)

这是一个很好的例子

https://docs.mongodb.com/manual/reference/operator/query/and/#and-queries-with-multiple-expressions-specifying-the-same-operator


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