MapReduceは適切な方法ですが、シャーディングを行っておらず、クエリの結果が10kを超えない場合は、問題ありません。
moongooseを介して任意のnode-mongodb-native関数にアクセスできるため、次のようになります。
var group = {
key: {},
cond: {item_id: item_id},
reduce: function(doc, out) {
out.count++;
out.total += doc.value;
},
initial: {
total: 0,
count: 0
},
finalize: function(out) {
out.avg = out.total / out.count;
}
};
Item.collection.group(group.key, group.cond, group.initial, group.reduce, group.finalize, true, function(err, results) {
console.log('group results %j', results);
});
node-mongodb-ネイティブソース:
https ://github.com/mongodb/node-mongodb-native/blob/master/lib/mongodb/collection.js#L1165
MongoDBグループドキュメント:
http ://www.mongodb.org/display/DOCS/Aggregation#Aggregation-Group