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



Mongodb Playground

我加入了另外两个集合,并希望按类别对其进行分组。

我想这样做:

[
{
"_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个元素。

这是我以前尝试过的:https://mongoplayground.net/p/FPCU4aV9a9X

然而,我不知道如何加入驱动程序集合,以将驱动程序名称与其中的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"
}
}
}

正在工作的Mongo游乐场

但这可能是我最简单的方法。由于您了解标准查询,因此还有另一种类型的联接条件和不相关的子查询。在这里,您可以并行使用联接集合中的stage。

脚本是

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"
}
}
])

正在工作的Mongo游乐场

最新更新