MongoDb 用于根据 id 筛选列表并将此筛选列表映射到另一个字段的聚合

MongoDb aggregation for filtering list based on ids and mapping this filtered list to another field

在我的mongodb中我有如下所示的数据:

{
  "classes": [
    {
      "classId": "SSC",
      "studentIds": [
        "1"
      ]
    },
    {
      "classId": "HSC",
      "studentIds": [
        "2",
        "3"
      ]
    }
  ],
  "students": [
    {
      "_id": "1",
      "student": {}
    },
    {
      "_id": "2",
      "student": {}
    },
    {
      "_id": "3",
      "student": {}
    }
  ], 
}

我想要一个聚合查询,这样 returns 数据如下所示:

"classes": [
    {
      "classId":"SSC",
      "students": [
        {
          "id": "1",
          "student": {}
        }
      ]
    },
    {
      "classId":"HSC",
      "students": [
        {
          "id": "2",
          "student": {},
        },
        {
          "id": "3",
          "student": {}
        }
      ]
    }
  ]

在这里我有一个 ID 列表。它应该过滤该 ID 的学生列表并获取该对象并将该对象放入 class 数组中。

我已经尝试使用 mongodb 聚合来解决这个问题。但不幸的是,我无法为此编写查询。那么我们是否可以使用聚合来实现上述场景呢

我正在使用 spring 启动 mongoTemplate。

您可以使用 $map$filter,

  • $map 输入 classes 数组创建学生字段并在学生数组中执行 $filter 并检查数组中是否包含条件 ID
db.collection.aggregate([
  {
    $project: {
      classes: {
        $map: {
          input: "$classes",
          as: "c",
          in: {
            classId: "$$c.classId",
            students: {
              $filter: {
                input: "$students",
                cond: { $in: ["$$this._id", "$$c.studentIds"] }
              }
            }
          }
        }
      }
    }
  }
])

Playground