我如何投影以从与过滤器不匹配的数组中删除属性

How do I project to remove attributes from an array that don't match a filter

我想筛选符合筛选条件的文档,然后进行项目以删除不符合要求的数组值。在这个例子中,我需要 pickme1 和 pickme2 都为真。 正在搜索属性 $eq 值

{
  "_id" : ObjectId("qewrjkl"),
  "attr" : "value",
  "aray1" [
    {
      "pickme1" : true,
      "data1" : "jklsdjk",
      "aray2" [
        {     
           "pickme2" : true,
           "data2" : "treasure1"
        },
        {     
           "pickme2" : false,
           "data2" : "trash1"
        },
      ]
    },
    {
      "pickme1" : false
      "data1" : "jklsdjk",
      "aray2" [
        {     
           "pickme2" : true,
           "data2" : "treasure2"
        },
        {     
           "pickme2" : false,
           "data2" : "trash2"
        },
      ]
    },
  ]
}

应该屈服

{
  "_id" : ObjectId("qewrjkl"),
  "attr" : "value",
  "results" [
    {"data2" : "treasure1"}
  ]
}

我从 collection.Aggregate().Match(filter).Lookup() 开始,认为我可以用查找填充数组,但意识到这无济于事。 我现在没有任何想法。有人有什么想法吗? 如果在数组中没有找到任何内容,则文档应该有一个空数组。

聚合

db.collection.aggregate([
  {
    $addFields: {
      aray1: {
        $filter: {
          input: {
            $map: {
              input: "$aray1",
              as: "a1",
              in: {
                aray2: {
                  $filter: {
                    input: "$$a1.aray2",
                    as: "ia2",
                    cond: {
                      $eq: [
                        "$$ia2.pickme2",
                        true
                      ]
                    }
                  }
                },
                pickme1: "$$a1.pickme1",
                data1: "$$a1.data1"
              }
            }
          },
          as: "oa1",
          cond: {
            $eq: [
              "$$oa1.pickme1",
              true
            ]
          }
        }
      }
    }
  },
  {
    "$project": {
      result: "$aray1.aray2",
      attr: 1
    }
  },
  {
    "$project": {
      "result.data2": 1,
      attr: 1
    }
  }
])

工作Mongo playground