2014-09-03 96 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來扭轉的。