我加入了其他两个收藏,并希望按类别对其进行分组。
我想要这样的项目:
[
{
"_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"
}
]
另外,我想按视图从最大到最小的顺序进行排序,并为每个类别投影仅前三个元素。
这是我之前尝试过的: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"
}
}
}
工作蒙戈游乐场
但这可能是我最简单的方法。由于您了解标准查找,因此还有另一种类型:联接条件和不相关子查询。在这里,您可以并行使用联接集合中的阶段。
该脚本是
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"
}
}
])
工作蒙戈游乐场
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句