2015-09-28 35 views
3

我需要得到一定值的出現次數的集合中,像這樣的:計數的GroupBy用帆 - 蒙戈

[ 
    {author: 'Diego', name: 'This is a great post', date:'03/13/78'}, 
    {author: 'Raul', name: 'Recipe for success', date:'02/03/99'}, 
    {author: 'Diego', name: 'Having too much fun', date:'01/01/77'}, 
    {author: 'Diego', name: 'Another post by me', date:'10/9/99'}, 
    {author: 'Diego', name: 'Mi first post', date:'01/01/73'}, 
    {author: 'Mariano', name: 'Mi best post', date:'01/01/95'}, 
] 

我想水線find()方法返回參數:

[ 
    {author: 'Diego', count: 4, date: '01/01/73'}, 
    {author: 'Raul', count: 1, date: '02/03/09'} 
] 

到目前爲止,我能夠得到的一切除了計數,這一點:

Model.find({ 
    where: {author: {'!': 'Mariano'}}, 
    groupBy: ['author'], 
    min: ['date'] 
// and count?!?!?! 
}).exec(function(err, items) { 
    //do something with items. 
}); 

我試過用「sum:['1']」但只給了我一個名爲「1」的屬性,每個結果行的值爲0。

回答

0

使用Node.js的骨料方法從我的代碼蒙戈DB本地 documentation

例子: SELECT COUNT從訂單,其中餐廳ID = ... GROUP BY createdAt ISO日期按它的第10個字符 - 天( 2015-01-10)

if(restaurantsFound.length > 0) { 
    var result = [], 
     Q = require('q'), 
     promises = []; 

    for(var r in restaurantsFound) { 
     promises[r] = (function() { 
      var deferred = Q.defer(); 

      Order.native(function(err, collection) { 
       if (err) { 
        console.error(err); 
        deferred.reject(err); 
       } 

       var ObjectID = require('mongodb').ObjectID; 
       var restaurantId = new ObjectID(restaurantsFound[r]); 
       collection.aggregate([ 
        { $match : { 
         restaurant : restaurantId 
        }}, 
        { $group : { 
         _id : {"_id":{"$substr":["$createdAt", 0, 10]}}, 
         count : { $sum : 1 }, 
         restaurant: {$addToSet: "$restaurant"} 
        }} 
       ], function(err, result) { 
        deferred.resolve(result); 
       }); 
      }); 

      return deferred.promise; 
     })(); 
    } 

    Q 
     .allSettled(promises) 
     .then(function(data) { 
      var result = []; 
      for(var k in data) { 
       result[k] = []; 
       for(var l in data[k].value) { 
        result[k].push({ 
         restaurant: data[k].value[l].restaurant[0].toString(), 
         count: data[k].value[l].count, 
         date: data[k].value[l]._id._id 
        }); 
       } 

      } 
      return res.ok(result); 
     }).catch(function(error) { 
      console.error(error.message); 
      return res.badRequest({message: error.message}); 
     }); 
}