MongoDB $并查询单个嵌入文档中的多个字段和值

Bra*_*nga 6 mongodb mongodb-query

我正在寻找一种方法来查询这样的集合:

[{ 
  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" }
  ]
 }
]
Run Code Online (Sandbox Code Playgroud)

使用这样的查询:

db.collection.find( 'items.name' => "Child at heart", 'items.age' => "60" )
Run Code Online (Sandbox Code Playgroud)

并获得名称为"Parent 2"的对象的结果.也就是说,我要查询寻找一个包含有一个嵌入式项目的那些文件一"在心脏的孩子"的名字, "60"的在这样一个时代一样嵌入文档.而是此查询返回两个文档,"父1"和"父2".

如何在同一嵌入式文档中的不同字段上查询$和条件?

谢谢.

小智 9

这里的问题是$and采用每个条件,将其应用于所有嵌入文档,并且如果任何嵌入文档匹配则将文档计为满足条件.它与条件无关.

你想要的运营商是$elemMatch.它执行您正在寻找的相关性.这是正确的查询:

db.collection.find({items: {$elemMatch: {name: 'Child at heart', age: '60'} }})
Run Code Online (Sandbox Code Playgroud)

items 是要搜索的数组的名称.

查询对样本数据的输出:

{
"_id" : ObjectId("51a012f0ac3dfe4f0c05ca89"),
"name" : "Parent 2",
"items" : [
    {
        "name" : "Child 3",
        "age" : "10"
    },
    {
        "name" : "Child 4",
        "age" : "15"
    },
    {
        "name" : "Child at heart",
        "age" : "60"
    }
]
}
Run Code Online (Sandbox Code Playgroud)