如何在MongoDB聚合中将相同的字段和项目分组为数组

如何在MongoDB聚合中将相同的字段和项目分组为数组,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我加入了其他两个系列,并希望按类别对其进行分组 我想这样做: [ { "_id": "101", "cars": [ { "carName": "CyberTruck", "driverName": "Tom", "views": 50 },

我加入了其他两个系列,并希望按类别对其进行分组

我想这样做:

[
  {
    "_id": "101",
    "cars": [
      {
        "carName": "CyberTruck",
        "driverName": "Tom",
        "views": 50
      },
      {
        "carName": "Model 3",
        "driverName": "Tom",
        "views": 40
      },
      {
        "carName": "Model X",
        "driverName": "Tom",
        "views": 30
      }
    ],
    "categoryName": "Tesla"
  },
  {
    "_id": "102",
    "cars": [
      {
        "carName": "X1",
        "driverName": "Mary",
        "views": 20
      }
    ],
    "categoryName": "BMW"
  }
]
此外,我想按视图从大到小对进行排序,并为每个类别投影前3个元素

这就是我以前试过的:


但是,我不知道如何加入驱动程序集合,以便将驱动程序名称与其中的driverId进行匹配。

使用您的脚本,我们可以执行以下另一个查找操作

{
    "$unwind": "$cars"
  },
  {
    $lookup: {
      from: "driver",
      localField: "cars.driverId",
      foreignField: "_id",
      as: "drivers"
    }
  },
  {
    $addFields: {
      drivers: "$$REMOVE",
      "cars.drivers": "$drivers"
    }
  },
  {
    "$group": {
      _id: "$_id",
      categoryName: {
        $first: "$categoryName"
      },
      cars: {
        $push: "$cars"
      }
    }
  }
工作

但这可能是最简单的方法。由于您了解标准查找,因此还有另一种类型。在这里,您可以在加入集合中并行使用阶段

剧本是

db.category.aggregate([
  {
    $lookup: {
      from: "car",
      let: {
        carId: "$_id"
      },
      pipeline: [
        {
          $match: {
            $expr: {
              $eq: [
                "$$carId",
                "$categoryId"
              ]
            }
          }
        },
        {
          $sort: {
            "views": -1
          }
        },
        {
          $limit: 3
        },
        {
          "$lookup": {
            "from": "driver",
            "localField": "driverId",
            "foreignField": "_id",
            "as": "drivers"
          }
        }
      ],
      as: "join"
    }
  }
])

工作

谢谢!我可以移除“driver”数组并像我的问题一样显示driverName吗?因为驾驶员和汽车之间是一对一的关系。好的,我解决了: