投影和筛选双嵌套数组 mongodb

Project and filter double nested array mongodb

{
   "id":"",
   "data0":"",
   "data1":[
      {
         "data2":[
            {
               "name":"Man 1",
               "_id":"5e8c242f751d0074ca004a"
            },
            {
               "name":"Man 2",
               "_id":"605d403dab6100e1395697"
            },
            {
               "name":"Man 3",
               "_id":"5e8c2d39751d0074ca0050"
            }
         ]
      },
      {
         "data2":[
            {
               "name":"Man 4",
               "_id":"5ed4efc71224005abea7eb"
            },
            {
               "name":"Man 5",
               "_id":"5e8c249539751d04ca0056"
            },
            {
               "name":"Man 6",
               "_id":"5e8c239a39751d0074c046"
            }
         ]
      }
   ]
}

上面的文档是我的数据结构。有没有一种方法可以过滤名称为 Man 3 的数组 (data1) 的元素。我只想显示名称值为 Man 3 的数组元素。我有这段代码,但它不起作用。这是示例。

                    pipeLine.push(
                    { $project: { 
                        'data1' : {
                            $filter: {
                                input: '$data1.data2',
                                as: 'test',
                                cond: { $eq : ['$$test.name', "Man 3" ]}
                            }
                        }
                     }}
                )

预期输出是这样的。

{
   "id":"",
   "data0":"",
   "data1":[
      {
         "data2":[
            {
               "name":"Man 1",
               "_id":"5e8c242f751d0074ca004a"
            },
            {
               "name":"Man 2",
               "_id":"605d403dab6100e1395697"
            },
            {
               "name":"Man 3",
               "_id":"5e8c2d39751d0074ca0050"
            }
         ]
      }
   ]
}

您应该使用 $in 运算符来检查“Man 3”是否在 data1.data2.name 中,此路径将 return 名称数组。

db.collection.aggregate([
  {
    $project: {
      "data1": {
        $filter: {
          input: "$data1",
          cond: {
            $in: [
              "Man 3",
              "$$this.data2.name"
            ]
          }
        }
      }
    }
  }
])

Sample Mongo Playground

如果您只需要该过滤器,您可以使用 find 查询而不是聚合:

db.collection.find({
  "data1.data2.name": "Man 3"
},
{
  "id": 1,
  "data0": 1,
  "data1.data2.$": 1
})

示例here

此外,如果您想要聚合阶段,请使用 $in 而不是 $eq:

db.collection.aggregate([
  {
    "$project": {
      "id": 1,
      "data0": 1,
      "data1": {
        "$filter": {
          "input": "$data1",
          "as": "d",
          "cond": {
            "$in": [
              "Man 3",
              "$$d.data2.name"
            ]
          }
        }
      }
    }
  }
])

示例here