Mongodb 基于使用$nin条件的字段从数组中筛选元素

Mongodb 基于使用$nin条件的字段从数组中筛选元素,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我有一个mongo文档,如下所示 { "_id": "123", "name": "ABC", "elements": { "_id": "123", "minorElements": [ [ { "id": "xyz1", "name": "xyz1" }, {

我有一个mongo文档,如下所示

{
    "_id": "123",
    "name": "ABC",
    "elements": {
        "_id": "123",
        "minorElements": [
            [
                {
                    "id": "xyz1",
                    "name": "xyz1"
                }, {
                    "id": "xyz2",
                    "name": "xyz2"
                }, {
                    "id": "xyz3",
                    "name": "xyz3"
                }
            ],
            [
                {
                    "id": "xyz1",
                    "name": "xyz1"
                }, {
                    "id": "xyz3",
                    "name": "xyz3"
                }, {
                    "id": "xyz5",
                    "name": "xyz5"
                }
            ]
        ]
    }
}
“elements.minorrelations”是数组的数组

如何编写mongo聚合以从“elements.minorerelations”中删除对象,其中“id”不在“xyz1”和“xyz2”中

预期产出:

{
    "_id": "123",
    "name": "ABC",
    "elements": {
        "_id": "123",
        "minorElements": [
            [{
                    "id": "xyz1",
                    "name": "xyz1"
                }, {
                    "id": "xyz2",
                    "name": "xyz2"
                }
            ],
            [{
                    "id": "xyz1",
                    "name": "xyz1"
                }
            ]
        ]
    }
}
外部阵列和内部阵列所需的示例有效负载:

db.collection.aggregate([
    {
        $addFields: {
            "elements.minorElements": {
                $map: {
                    input: "$elements.minorElements",
                    as: "me",
                    in: {
                        $filter: {
                            input: "$$me",
                            cond: {
                                $in: [ "$$this.id", [ "xyz1", "xyz2" ] ]
                            } 
                        }
                    }
                }
            }
        }
    }
])
需要注意的两点: 首先,

从“elements.MinoRelations”中删除对象,其中“id”不在“xyz1”和“xyz2”中

=>只是意味着您需要保留(项目)元素,其中id为“xyz1”或“xyz2”(或[“xyz1”、“xyz2”]中的id)

第二,

正如您所注意到的,“elements.minorrelations”是一个数组的数组。因此,当您应用$filter操作符时,您尝试将其应用到数组上

技巧是对数组的第一级应用$map操作符,然后对$map的每个元素应用$fiter操作符

问题是:

db.collection.aggregate([
  {
    "$project": {
      "elements.minorElements": {
        "$map": {
          "input": "$elements.minorElements",
          "as": "item",
          "in": {
            $filter: {
              input: "$$item",
              as: "subItem",
              cond: {
                $in: [
                  "$$subItem.id",
                  [
                    "xyz1",
                    "xyz2"
                  ]
                ]
              }
            }
          },

        }
      }
    }
  }
])