我是mongodb的新手,我正在尝试查询子对象。我有一系列国家,每个国家都有儿童城市。其中一个城市的Name属性为null,这会导致我的应用程序出错。如何查询State集合以查找名称为== null的子城市?
答案 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});
因为此查询将返回缺少密钥的所有文档(在我们的示例中,它将返回西班牙和法国)。因此,除非您确定密钥始终存在,否则必须检查密钥是否存在,如第一个查询中所示。