0

毎月の注文を処理するレポート プロジェクトに取り組んでいます。以下の形式で MongoDB に注文が入ります。

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

したがって、これにより、最初に注文が最も多いアイテムのソートされたリストが得られるはずです。

しかし、ループせずに特定のアイテムのランクを取得するにはどうすればよいでしょうか? 私はほぼ500,000の異なるアイテムについて話しているので、ループを避けたい

事前に助けてくれてありがとう。

更新:これが私が最終的に機能させたものです。この例では 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});
                });
            }
    );

}
4

1 に答える 1

1

この機能は、現時点では集約フレームワークには存在しません。ランキングを取得するには、 jira.mongodb.org/browse/SERVER-8065を実装する必要があります。

一方、2 つの集計フレームワーク クエリを使用してこれを行うことができます。

最初のものは、問題の特定のアイテムの合計を集計して取得します(質問に含めるものと似ていますが、 $group 形式が正しくないはずです{$group: {_id:"$items.code", <etc>})。「items.code」を特定の値に制限することから始めます。

2 つ目はすべてのコレクションに対するものであり、集計後、この 1 つのアイテムよりも高い「合計」の数をカウントするために{match:{count:{$gt:<count-for-that-one-item>}}別のことを行うことができます。$groupそれはあなたにアイテムのランクを与えます。

于 2013-05-15T06:11:07.810 に答える