Mongodb 根据项目在另一个集合中被引用的次数对项目进行排序
我有一个项目集合,每个项目都有一个类型(水果、蔬菜等)和一个ID:Mongodb 根据项目在另一个集合中被引用的次数对项目进行排序,mongodb,mongoose,mongodb-query,aggregate,Mongodb,Mongoose,Mongodb Query,Aggregate,我有一个项目集合,每个项目都有一个类型(水果、蔬菜等)和一个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([ { $grou
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
类型
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" }
}
}
])
工作这可能会帮助你
加入两个集合。我用过$lookup
解构阵列。因为我们无法对数组进行排序$unwind
按降序排序$sort
通过$group
类型
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" }
}
}
])
工作