2013-05-15 4 views
0

Я работаю над проектом отчетности, которые касаются ежемесячных заказов Мы заказов, поступающих в MongoDB в приведенном ниже форматеПоиск определенной записи в агрегации коллекции Монго DB

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

} 
+0

Это не юридический конвейер агрегации - ваша «группа» не структурирована правильно. –

+0

эта функция в настоящее время не существует в структуре агрегации. Вам понадобится https://jira.mongodb.org/browse/SERVER-8065 для реализации, чтобы получить рейтинг. –

ответ

1

В настоящее время эта функция не существует в структуре агрегации. Вам понадобится jira.mongodb.org/browse/SERVER-8065 для реализации, чтобы получить рейтинг.

Между тем вы можете сделать это с помощью двух запросов к структуре агрегации.

Первый будет агрегировать и получить итоговые значения для конкретного предмета, о котором идет речь (он будет похож на то, что вы включаете в свой вопрос, но ваш формат $ group неверен, он должен быть {$group: {_id:"$items.code", <etc>}). Вы начнете с ограничения «items.code» до определенного значения.

Второй будет для всей коллекции, а затем после агрегации вы можете сделать {match:{count:{$gt:<count-for-that-one-item>}}, а затем сделать еще один $group, чтобы подсчитать, сколько «итогов» было выше, чем у этого предмета. Это дает вам рейтинг предмета.

+0

Большое спасибо за ответ. Я проверю это и обновлю. – Srijit

+0

Спасибо .. Это работает .. Я также размещаю рабочий код в обновлении – Srijit

Смежные вопросы