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

问题描述

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

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

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

          }
        ]

}

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

db.collection.find({"level1.name":{$eq:"Bill"}})

但是,例如,如果我想对技能范围等于“杂技”的文档进行数学计算,则可以这样做:

db.collection.find({"level1.level2.skill":{$eq:"acrobatics"}})

行不通,知道吗? (很抱歉,示例的命名没有太大意义,但这就是我要面对的结构。)

谢谢!

解决方法

有多种方法可以执行此操作。您可以尝试这样的事情。

  1. $unwind展平第一级数组
  2. $match以匹配您需要的元素
  3. $group分组回到同一级别

下面给出了Shell查询

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

工作Mongo playground