Mongodb 在Mongo DB集合的聚合中查找特定记录
我正在做一个报告项目,处理每月的订单 我们有以下格式的订单进入MongoDBMongodb 在Mongo DB集合的聚合中查找特定记录,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我正在做一个报告项目,处理每月的订单 我们有以下格式的订单进入MongoDB order:{ _id: 123456789012123456789012, items:[ {code:'ITEM1', qty:5},{code:'ITEM2', qty:6} ] } 我的要求是找出一个特定的项目相对于其他项目在整体性能上的排名 我编写这个聚合是为了首先找出每个项目的分组和订购的数量 db.orders.aggregate( [ { $unwind : "$items"
order:{
_id: 123456789012123456789012,
items:[
{code:'ITEM1', qty:5},{code:'ITEM2', qty:6}
]
}
我的要求是找出一个特定的项目相对于其他项目在整体性能上的排名
我编写这个聚合是为了首先找出每个项目的分组和订购的数量
db.orders.aggregate(
[
{ $unwind : "$items" },
{ $group : {code : "$code" , tot_ord: { $sum : "$qty" } } },
{ $sort : { tot_ord : -1 } }
]
)
因此,这应该首先给我一个排序的项目列表
但是我如何在不循环的情况下获得特定项目的排名呢?我说的是将近500000个不同的项目,所以我想避免循环
提前谢谢你的帮助
更新:
这就是我最终让它工作的原因。本例使用Node.js。我发布这篇文章是为了将来对某人有用
function aggregate(mongoDb,collection_item, pipeline, next){
mongoDb.collection(collection_item, function(err, collection) {
collection.aggregate(pipeline,function(err,result) {
if(err){
console.log('Error aggregating: ' + err);
next({'error':'An error has occurred - ' + err});
}else{
next(result);
}
});
});
}
function calculateOrderRank(itemId){
aggregate(mongoDb, "orders",
[
{ $unwind : "$items" },
{ $match : { items.code : itemId} },
{ $group : { _id : "$items.code" , tot_qty: { $sum : "$items.qty" } } }
],function(result) {
var itemQty = result[0].tot_qty;
data.aggregate(mongoDb, "orders",
[
{ $unwind : "$items" },
{ $group : { _id : "$items.code" , tot_qty: { $sum : "$items.qty" } } },
{ $match: {tot_qty:{$gt:itemQty}} },
{ $group : {_id:null, rank : { $sum : 1 } } },
],function(result) {
var rank = 1;
if (result && result.length>0) {
rank = result[0].rank + 1;
}
res.send({item_id:itemId, rank:rank, score:itemQty});
});
}
);
}
此时聚合框架中不存在此功能。您将需要实施才能获得排名 同时,您可以通过两个聚合框架查询来实现这一点 第一个将聚合并获得所讨论的特定项目的总数(这与您在问题中包含的内容类似,但您的$group格式不正确,它应该是
{$group:{{u id:“$items.code”,}
)。您可以从将“items.code”限制为特定值开始
第二个是所有集合,聚合后,您可以执行
{match:{count:{$gt:}}
,然后执行另一个$group
来计算有多少“总计”高于此项。这将为您提供该项的排名。这不是合法的聚合管道-您的“$group”结构不正确。目前聚合框架中不存在此功能。您需要实现才能获得排名。非常感谢您的回复。我将对此进行测试并进行更新。谢谢..它有效..我还在更新中发布工作代码