如何在mongodb中查询子对象

时间:2011-01-21 19:28:07

标签: mongodb

我是mongodb的新手,我正在尝试查询子对象。我有一系列国家,每个国家都有儿童城市。其中一个城市的Name属性为null,这会导致我的应用程序出错。如何查询State集合以查找名称为== null的子城市?

2 个答案:

答案 0 :(得分:95)

如果它恰好是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}}
]})

答案 1 :(得分:33)

假设您的“州”收集如下:

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

查找具有空城市的状态的查询将是:

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

查询空值是一个常见的错误

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

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