mongodb - 根据项目在另一个集合中被引用的次数对项目进行排序
问题描述
我有一个项目集合,每个项目都有一个类型(水果、蔬菜等)和一个 ID:
type: 'Fruit',
_id: '0'
type: 'Vegetable',
_id: '1'
type: 'Fruit',
_id: '2'
然后我有一个购买集合,每个购买引用一个项目:
item_id: '2'
item_id: '1'
item_id: '0'
item_id: '2'
现在,我可以使用以下代码获得最畅销的商品:
buySchema.aggregate([
{ $group: { _id: "$item_id", numFills: { $sum: 1 } } },
{ $sort: { numFills: -1 } }
]).limit(10).exec(function (err, top) {
if (err) return res.status(400).send('error');
return res.status(200).send(top);
});
此代码输出以下 json:
[
{
"_id": "2",
"numFills": 2
},
{
"_id": "0",
"numFills": 1
},
{
"_id": "1",
"numFills": 1
}
]
我现在想要的是每种类型的顶级列表(一个用于水果,另一个用于蔬菜等),如下所示:
[
{
"type": "Fruits",
"items": [
{
"_id": "2",
"numFills": 2
},
{
"_id": "0",
"numFills": 1
}
]
},
{
"type": "Vegetables",
items: [
{
"_id": "1",
"numFills": 1
}
]
}
]
解决方案
这可能会帮助你,
$lookup
加入两个集合。我使用了不相关的查找$unwind
解构数组。因为我们不能对数组进行排序$sort
按降序排序$group
重建数组type
脚本在这里
db.items.aggregate([
{
"$lookup": {
"from": "buys",
"let": { iId: "$_id" },
"pipeline": [
{
$match: {
$expr: { $eq: [ "$item_id", "$$iId" ] }
}
},
{
$group: {
_id: "$item_id",
numFills: { $sum: 1 }
}
}
],
"as": "joinBuys"
}
},
{ "$unwind": "$joinBuys" },
{
$sort: { "joinBuys.numFills": -1 }
},
{
$group: {
_id: "$type",
items: { $push: "$joinBuys" }
}
}
])
工作Mongo游乐场
推荐阅读
- php - 如何在一张表中存储不同的报告(MySQL + PHP)
- python - 如何摆脱python中的一个空白?
- javascript - 创建 HTML 元素时如何选择未使用的变量名?
- c# - 使用 AutoMapper 映射两个不同类型的集合
- c# - .NET5 两个对象文件名解析为相同的输出路径
- javascript - 棘手的字符串争夺反应
- ios - UICollectionView 补充视图初始化在滚动时被一遍又一遍地调用
- java - 应用程序启动方法中的异常位置是必需的。JAVAFX
- linux - 如何更改 RedHat 系统中 xml 文档的子节点中的信息?
- javascript - 无法在移动设备上使用 Nivo 工具提示或十字准线可拖动性