mongodb使用AND和OR查询

use*_*632 36 mongodb

我可以在mongodb查询中使用OR和AND的组合吗?

以下代码无法按预期工作

db.things.find({
           $and:[
                {$or:[
                     {"first_name" : "john"}, 
                     {"last_name" : "john"}
                ]},
                {"phone": "12345678"}
            ]});
Run Code Online (Sandbox Code Playgroud)

数据库内容:

> 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" }
Run Code Online (Sandbox Code Playgroud)

在查询上面的查询时 - 我什么都没得到!

> db.things.find({$and:[{$or:[{"first_name" : "john"}, {"last_name" : "john"}]},{"phone": "12345678"}]});
>
Run Code Online (Sandbox Code Playgroud)

我正在使用mongo 1.8.3

its*_*oor 28

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

AND取一个2个表达式的数组OR,phone.
OR采用2个表达式first_name,last_name的数组.

  • 要么

    • 名字
  • 电话号码.

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


Set*_*thO 11

我相信$和只支持MongoDB v2.0 +.我很惊讶控制台首先接受了这个表达方式.我将尝试重新创建我所拥有的1.8服务器.

还要检查10gen公司的高级查询文档$and.

更新

我将示例数据输入到v1.8x和v2.0x MongoDB服务器中.该查询适用于v2.0x,并且在v1.8x上失败.这证实了我(和Miikka)怀疑问题与$and您的服务器版本有关.

我发现这是一个(可以说)聪明的解决办法在网络上点击这里.我希望这有帮助.

-SethO


Chi*_*hit 11

这可以通过以下方式实现(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 } } ] }
        ]
    } )

此查询将选择所有文档:

price字段值等于0.99或1.99,sale字段值等于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中


Tec*_*dom 7

使用隐式AND运算更短:

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