【问题标题】:mongodb queries both with AND and ORmongodb 使用 AND 和 OR 查询
【发布时间】:2012-06-25 19:33:06
【问题描述】:

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

【问题讨论】:

  • 我猜这是您正在运行的旧版本 MongoDB 的问题。您的查询似乎适用于 2.0.6。

标签: mongodb


【解决方案1】:
 db.things.find( {
      $and : [
               { 
                 $or : [ 
                         {"first_name" : "john"},
                         {"last_name" : "john"}
                       ]
               },
               { 
                 "Phone":"12345678"
               }
             ]
    } )

AND 采用由 2 个表达式组成的数组 OR ,电话。
OR 采用由 2 个表达式组成的数组 first_name ,last_name。

    • 名字
    • 姓氏
  • 电话号码。

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

【讨论】:

    【解决方案2】:

    使用隐式 AND 操作更短:

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

    【讨论】:

      【解决方案3】:

      这可以通过以下方式实现(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({ $和:[ { $or : [ { price : 0.99 }, { price : 1.99 } ] }, { $or : [ { sale : true }, { 数量 : { $lt : 20 } } ] } ] })

      此查询将选择所有文档,其中:

      价格字段值等于 0.99 或 1.99,并且 sale 字段值等于 true 或 qty 字段值小于 20。

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

      考虑以下查询...

      db.getCollection('tbl_menu_items').find( {'$或': [ {'$和': [{位置:{'$in':[ObjectId(“588054c63879f2e767a1d553”)]}}, { is_ryward: 1 }, { points_reqiured_to_redeem_reward: { '$lte': 500 } } ] }, {'$和': [{位置:{'$in':[ObjectId(“588054c63879f2e767a1d553”)]}}, { is_freebie: 1 } ] } ] } )

      此查询将选择所有文档,其中:

      位置数组在 588054c63879f2e767a1d553 和 is_ryward = 1 和 points_reqiured_to_redeem_reward

      或者

      588054c63879f2e767a1d553 和 is_freebie 中的位置数组

      【讨论】:

        【解决方案4】:

        我相信 $and 仅在 MongoDB v2.0+ 中受支持。我很惊讶控制台首先接受了这个表达式。我将尝试针对我拥有的 1.8 服务器重新创建。

        还要检查10Gen's Advanced Query Documentation 是否有$and

        更新

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

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

        -SethO

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-05-27
          • 1970-01-01
          • 2017-08-11
          • 1970-01-01
          • 2018-10-24
          • 2017-09-26
          • 1970-01-01
          相关资源
          最近更新 更多