2011-07-27 100 views
19

我已經在shell中構建了我想要的查詢,但是在Mongoose中編寫它時遇到了困難。集團(By)在貓鼬?

db.commentstreams.group({ key: { page_id: true }, reduce: function(obj,prev) { prev.num_comments += obj.num_comments }, initial: { num_comments: 0 } }) 

我對Mongoose語法有些困惑;也許有人可以在這一點上提出一些看法。非常感謝。

+1

我的生活故事。 – weisjohn

回答

14

根據this post

Model.find({}, [fields], {'group': 'FIELD'}, function(err, logs) { 
     ... 
}); 

不幸的是,我們似乎缺少文檔這一個。

+1

這似乎不起作用 - 它將所有文檔返回爲空查找。 –

+1

$組而不是組? –

13

MapReduce應該是正確的路要走,但如果你不分片,並且你的查詢不會導致超過10k條記錄,那就OK了。

您可以通過moongoose訪問任何節點MongoDB的原生功能,所以它看起來是這樣的:

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

節點MongoDB的原生來源: https://github.com/mongodb/node-mongodb-native/blob/master/lib/mongodb/collection.js#L1165

MongoDB的組DOC: http://www.mongodb.org/display/DOCS/Aggregation#Aggregation-Group