蒙戈查询对象缺少关键
问题描述:
我有一个蒙戈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”,基本上要求的是查找数组元素包含“日期”值但不包含“价格”的文档。由于数组元素匹配有两个条件需要$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
来扭转的。