如何在mongodb中查询子对象

Jus*_*tin 72 mongodb

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

The*_*heo 101

如果它完全null(而不是未设置):

db.states.find({"cities.name": null})
Run Code Online (Sandbox Code Playgroud)

(但正如javierfp指出的那样,它也匹配没有城市数组的文档,我假设他们这样做了).

如果未设置该属性的情况:

db.states.find({"cities.name": {"$exists": false}})
Run Code Online (Sandbox Code Playgroud)

我用以下两个插件创建的集合测试了上面的内容:

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

第一个查询查找第一个状态,第二个查询查找第二个查询.如果您想通过一个查询找到它们,您可以进行$or查询:

db.states.find({"$or": [
  {"cities.name": null}, 
  {"cities.name": {"$exists": false}}
]})
Run Code Online (Sandbox Code Playgroud)


Jav*_*ero 36

假设您的"州"集合如下:

{"name" : "Spain", "cities" : [ { "name" : "Madrid" }, { "name" : null } ] }
{"name" : "France" }
Run Code Online (Sandbox Code Playgroud)

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

db.states.find({"cities.name" : {"$eq" : null, "$exists" : true}});
Run Code Online (Sandbox Code Playgroud)

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

db.states.find({"cities.name" : null});
Run Code Online (Sandbox Code Playgroud)

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