Javascript MongoDB在嵌套数组聚合中查找

Javascript MongoDB在嵌套数组聚合中查找,javascript,node.js,mongodb,mongoose,aggregation-framework,Javascript,Node.js,Mongodb,Mongoose,Aggregation Framework,我在下面解释了嵌套数组文档: countries: [ { "id": "id of country", "cities": [ { "id": "id of city 1", "areas": [ { "id": "id of area 1

我在下面解释了嵌套数组文档:

countries: [
  {
    "id": "id of country",
    "cities": [
      {
        "id": "id of city 1",
        "areas": [
          {
            "id": "id of area 1"
          },
          {
            "id": "id of area 2"
          },
          {
            "id": "id of area 3"
          },
          {
            "id": "id of area 4"
          }
        ]
      },
      {
        "id": "id of city 2",
        "areas": [
          {
            "id": "id of area 1"
          },
          {
            "id": "id of area 2"
          },
          {
            "id": "id of area 3"
          },
          {
            "id": "id of area 4"
          }
        ]
      }
    ]
  }
]
我的目标是使用
$addFields
添加一个字段,以指示给定的id是否与区域id匹配

{$addFields: {
    isDeliveringToArea: {
      $in: [ObjectId('5db5d11cb18a2500129732a5'),'$countries.cities.areas.id']
    } 
}}
但是显然,
$in
不适用于嵌套数组。
我希望find方法类似于Model.find({'countries.cities.areas.id':'areaID'})但要在聚合中返回布尔值。

由于有3级嵌套数组,我们可以使用
$map
实现这一点,该方法用于运行/修改所有对象。第一个
$map
用于遍历每个国家对象,第二个
$map
用于遍历每个国家对象内的每个城市对象

更新1

由于您需要所有字段,因此可以使用
$anyElementTrue
执行此操作,如果在我们的条件下有任何元素为true,它将发出true

工作

我保留旧的查询供您参考。
工作

@turivishal在管道聚合中感谢,@varman的帮助,但我需要将isDeliveringToArea添加到主要文件中,而不是添加到国家的每个元素中,类似于此[{id:1,国家:[……],isDeliveringToArea:true},{id:2,国家:[……],isDeliveringToArea:false}]
[
  {
    "$addFields": {
      isDeliveringToArea: {
        $anyElementTrue: {
          $map: {
            input: "$countries",
            in: {
              $anyElementTrue: {
                $map: {
                  input: "$$this.cities",
                  in: {
                    $in: [
                      "6",
                      "$$this.areas.id"
                    ]
                  }
                }
              }
            }
          }
        }
      }
    }
  }
]