2011-01-21 63 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}); 

因为此查询将返回缺少密钥的所有文档(在我们的示例中它将返回西班牙和法国)。因此,除非您确定密钥始终存在,否则必须检查密钥是否存在于第一个查询中。