1

我是Nodejs和MongoDB的新手。
這裏是我的數據集的樣本:Nodejs + Mongodb:聚合後查找數據

{ 
    'name': ABC, 
    'age':24, 
    'gender':male, 
    ... 
} 

一般來說,我想要做的就是利用他們找不同的數據集羣前彙總數據。
具體而言,我想知道在不同年齡有多少人。然後,找到每個年齡段的人(文件)並存儲它們。

這裏是我的代碼:

MongoClient.connect(url, function(err, db) { 
    if(err) { 
     console.log('Unable to connect to the mongoDB server. Error:', err); 
    } else { 
     db.collection('test').aggregate(
     [ 
      { $group: { _id: "$age" , total: { $sum: 1 } } }, 
      { $sort: { total: -1 } } 
     ]).toArray(function(err, result) { 
      assert.equal(err, null); 
      age = []; 
      for(var i in result) { 
       age.push(result[i]['_id']) 
      }; 
      ageNodes = {}; 
      for(var i in age) { 
       nodes = []; 
       var cursor = db.collection('test').find({'age':age[i]}); 
       // query based on aggregated data 
       cursor.each(function(err,doc){ 
        if(doc!=null){ 
         nodes.push(doc); 
        } else { 
         console.log(age[i]); 
         ageNodes[age[i]] = nodes; 
        } 
       }) 
      } 
      res.json(ageNodes); 
     }); 
    }; 
}); 

我預期的JSON格式:

{ 
    age:[different documents] 
} 

例如:

{ 
    20:[{name:A,gender:male,...},{},...], 
    30:[{name:B,gender:male,...},{},...], 
    ... 
} 

不過,我得到的是一個空的結果,所以我覺得也許它是由for循環造成的。
我不知道如何處理異步回調。

回答

2

你只需要運行下面的管道,它使用$push到根文檔(在管道$$ROOT系統變量表示)添加到每個年齡組的數組:

MongoClient.connect(url, function(err, db) { 
    if(err) { 
     console.log('Unable to connect to the mongoDB server. Error:', err); 
    } else { 
     db.collection('test').aggregate([ 
      { 
       '$group': { 
        '_id': '$age', 
        'total': { '$sum': 1 }, 
        'docs': { '$push': '$$ROOT' } 
       } 
      }, 
      { '$sort': { 'total': -1 } } 
     ]).toArray(function(err, results) { 
      console.log(results); 
      var ageNodes = results.reduce(function(obj, doc) { 
       obj[doc._id] = doc.docs 
       return obj; 
      }, {}); 
      console.log(ageNodes); 
      res.json(ageNodes); 
     }); 
    }; 
}); 
+0

感謝。但在這一行發生錯誤 - '文檔':{'$ push':'$$ ROOT'}。 SyntaxError:意外的字符串 –

+0

錯字,忘在'total'後面加一個逗號:{'$ sum':1}' – chridam

+1

它有效。非常感謝。 –