2014-09-03 99 views
2

我有一个蒙戈DB与存储在该格式的数据:在DB蒙戈查询对象缺少关键

{ "_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")} ] } 

我需要查询数据库以查找1)历史数组中的每个条目都有日期和价格的所有对象,以及2)所有对象wh在历史阵列中有一个“日期”条目与“价格”条目不匹配。谢谢你的帮助!

回答

2

为了清楚起见,先回答“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来扭转的。