2011-01-21 830 views
55

我是新來的mongodb,並且正在嘗試查詢子對象。我有一個國家的集合,每個國家都有兒童城市。其中一個城市的名稱屬性爲null,這會導致我的應用出現錯誤。我將如何查詢州集合以查找具有名稱== null的子城市?如何查詢mongodb中的子對象

+0

問題需要澄清正在使用哪種編程語言/驅動程序,以及人們可以正確回答的文檔示例 – 2011-01-22 11:03:34

回答

84

如果正是null(相對於不設置):

db.states.find({"cities.name": null}) 

(但javierfp指出,這也符合那些沒有城市數組中的所有文件,我假設他們這樣做)。

如果它的屬性沒有設置的情況下:

db.states.find({"cities.name": {"$exists": false}}) 

我測試過以上這兩個刀片創建的集合:

db.states.insert({"cities": [{name: "New York"}, {name: null}]}) 
db.states.insert({"cities": [{name: "Austin"}, {color: "blue"}]}) 

第一個查詢尋找第一狀態,第二個查詢找到第二個。如果你想找到他們都與一個查詢就可以使一個$or查詢:

db.states.find({"$or": [ 
    {"cities.name": null}, 
    {"cities.name": {"$exists": false}} 
]}) 
22

假設你的「狀態」集合是這樣的:

{"name" : "Spain", "cities" : [ { "name" : "Madrid" }, { "name" : null } ] } 
{"name" : "France" } 

查詢找到與空市州將:

db.states.find({"cities.name" : {"$eq" : null, "$exists" : true}}); 

這是一個常見的錯誤空查詢爲:

db.states.find({"cities.name" : null}); 

因爲此查詢將返回缺少密鑰的所有文檔(在我們的示例中它將返回西班牙和法國)。因此,除非您確定密鑰始終存在,否則必須檢查密鑰是否存在於第一個查詢中。