【问题标题】:mongo query for objects with missing keymongo 查询缺少键的对象
【发布时间】:2014-09-03 09:02:19
【问题描述】:

我有一个以这种格式存储数据的 Mongo 数据库:

{ "_id" : ObjectId("53e27f602041f3c6fe5373a8"), 
  "miles" : 112650, 
  "history" : [ { "date" : ISODate("2014-05-26T00:00:00Z"), "price" : 8995 }, 
                { "date" : ISODate("2014-06-01T00:00:00Z"), "price" : 8995 } ] }

数据库中的对象可以在历史数组中存储任意数量的“日期”和“价格”数据点。但是,数据库中的某些对象将有多个历史数据点,但最后一个“日期”键/值对与“价格”键/值对不匹配,如下所示:

{ "_id" : ObjectId("53e27f602041f3c6fe5373a8"), 
  "miles" : 112650, 
  "history" : [ { "date" : ISODate("2014-05-26T00:00:00Z"), "price" : 8995 }, 
                { "date" : ISODate("2014-06-01T00:00:00Z")} ] }

我需要查询 db 以查找 1) 历史数组中的每个条目都有日期和价格的所有对象,以及 2) 历史数组中具有与“日期”条目不匹配的“日期”条目的所有对象价格”条目。感谢您的帮助!

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:

    首先回答“2”的原因将变得很清楚,您基本上要求的是找到其数组元素确实包含“日期”值但不包含“价格”的文档。由于您想要$elemMatch 的数组元素匹配有两个条件。并测试您想要$exists 的字段是否存在,如下所示:

    db.collection.find({
      "history": {
        "$elemMatch": {
          "date": { "$exists": true },
          "price": { "$exists": false }
        }
      }
    })
    

    这将返回您的第二个样本,因为其中一个数组条目没有“价格”。

    为了回答“1”,这基本上只是上面逻辑的,所以你这里介绍的就是$not操作符:

    db.collection.find({
      "history": {
        "$not": { 
          "$elemMatch": {
            "date": { "$exists": true },
            "price": { "$exists": false }
          }
        }
      }
    })
    

    这会生成示例中的第一个文档,因为在这种情况下,“价格”存在于所有元素中,因此断言条件将是 false,但可以通过使用 $not 来扭转这种情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多