Arrays MongoDB在具有多个嵌套级别的数组和对象中查找

Arrays MongoDB在具有多个嵌套级别的数组和对象中查找,arrays,mongodb,nested,Arrays,Mongodb,Nested,我尝试匹配此嵌套结构中的文档,它适用于一个级别,但不适用于第二个级别: { type:"example" level1:[ { name:"Bill" level2:[ { skill:"gardening" },

我尝试匹配此嵌套结构中的文档,它适用于一个级别,但不适用于第二个级别:

{
 type:"example"
 level1:[
          {
            name:"Bill"
            level2:[
                     {
                       skill:"gardening"
                     },
                     {
                       skill:"carpentry"
                     }
            ]

           },

          {
            name:"John"
            level2:[
                     {
                       skill:"painting"
                     },
                     {
                       skill:"acrobatics"
                     }
            ]

          }
        ]

}
我可以匹配第一级数组,例如:

db.collection.find({"level1.name":{$eq:"Bill"}})
但是,例如,如果我想用等于“acrobatics”的技能字段对文档进行数学计算,我会:

没用,你知道吗? (如果示例的命名没有多大意义,那么很抱歉,但这就是我面临的结构)


谢谢大家!

有多种方法可以做到这一点。你可以试试这样的

  • $unwind
    展开一级阵列
  • $match
    以匹配所需的元素
  • $group
    分组回同一级别
  • Shell查询如下所示

    [
      {
        "$unwind": "$level1"
      },
      {
        $match: {
          "level1.level2.skill": "acrobatics"
        }
      },
      {
        "$group": {
          _id: "$_id",
          level1: {
            "$addToSet": "$level1"
          }
        }
      }
    ]
    

    工作

    有多种方法可以做到这一点。你可以试试这样的

  • $unwind
    展开一级阵列
  • $match
    以匹配所需的元素
  • $group
    分组回同一级别
  • Shell查询如下所示

    [
      {
        "$unwind": "$level1"
      },
      {
        $match: {
          "level1.level2.skill": "acrobatics"
        }
      },
      {
        "$group": {
          _id: "$_id",
          level1: {
            "$addToSet": "$level1"
          }
        }
      }
    ]
    

    工作

    工作正常你的问题是什么?查询不起作用,或者结果中需要整个结构?您可以先更新您的问题。它将返回整个结构,因为集合中只有一个文档与查询匹配。@Mapin您可以使用
    $
    在“查找”中进行项目检查@varman是的,您是对的,这仅在唯一值中有用,对于多个匹配,唯一的选择是聚合。它确实有效。您的问题是什么?查询不起作用,或者结果中需要整个结构?您可以先更新您的问题。它将返回整个结构,因为集合中只有一个文档与查询匹配。@Mapin您可以使用
    $
    在“查找”中进行项目检查@varman是的,您是对的,这仅在唯一值中有用,对于多个匹配,唯一的选项是聚合。谢谢,我还必须使用管道进行快速分类:)这样您就可以轻松地使用
    $match
    阶段。@varman您可以使用
    $push
    而不是
    $addToSet
    ,因为
    $addToSet
    将替换相同的对象,谢谢,我还必须使用管道来快速分类:)这样您就可以轻松地使用
    $match
    阶段。@varman您可以使用
    $push
    而不是
    $addToSet
    ,因为
    $addToSet
    将替换相同的对象,看