我正在寻找一种方法来查询这样的集合:
[{
name: "Parent 1",
items: [
{ name: "Child 1", age: "60" },
{ name: "Child at heart", age: "27" }
]
},
{
name: "Parent 2",
items: [
{ name: "Child 3", age: "10" },
{ name: "Child 4", age: "15" },
{ name: "Child at heart", age: "60" }
]
}
]
使用如下查询:
db.collection.find( 'items.name' => "Child at heart", 'items.age' => "60" )
获得名称为“Parent 2”的对象的结果。也就是说,我想查询文档,查找包含两者名称为“Child at heart”,和年龄为“60”的嵌入项目的文档“在相同的嵌入式文档中。而是此查询返回两个文档,“父1”和“父2”。
如何在同一嵌入文档中的不同字段上查询$和条件?
感谢。
答案 0 :(得分:9)
这里的问题是$and
接受每个条件,将其应用于所有嵌入文档,并且如果任何嵌入文档匹配,则将文档计为满足条件。它没有关联条件。
您想要的运营商是$elemMatch
。它执行您正在寻找的相关性。这是正确的查询:
db.collection.find({items: {$elemMatch: {name: 'Child at heart', age: '60'} }})
items
是您要搜索的数组的名称。
示例数据查询的输出:
{
"_id" : ObjectId("51a012f0ac3dfe4f0c05ca89"),
"name" : "Parent 2",
"items" : [
{
"name" : "Child 3",
"age" : "10"
},
{
"name" : "Child 4",
"age" : "15"
},
{
"name" : "Child at heart",
"age" : "60"
}
]
}