2013-02-03 43 views
5

如果我的集合看起來像這樣,如何獲取集合中的全部評論。 (不是每個職位,但總總的意見的收集。)獲取集合中的子文檔總數

{ 
    _id: 1, 
    post: 'content', 
    comments: [ 
     { 
      name: '', 
      comment: '' 
     } 
    ] 
} 

如果我有立柱A 3組的意見和後B帶5層的意見。結果應該是8

回答

12

您可以使用aggregation framework

> db.prabir.aggregate(
    { $unwind : "$comments" }, 
    { $group: { 
     _id: '', 
     count: { $sum: 1 } 
    } 
}) 
{ "result" : [ { "_id" : "", "count" : 8 } ], "ok" : 1 } 

簡而言之這個(臨時)創建爲每個評論一個單獨的文件,然後對每個文件遞增count


對於大量的帖子和評論它 可能更有效跟蹤的評論數量。當添加評論時,你也增加一個計數器。例如:

// Insert a comment 
> comment = { name: 'JohnDoe', comment: 'FooBar' } 
> db.prabir.update(
    { post: "A" }, 
    { 
     $push: { comments: comment }, 
     $inc: { numComments: 1 } 
    } 
) 

再次使用聚合框架:

> db.prabir.aggregate(
    { $project : { _id: 0, numComments: 1 }}, 
    { $group: { 
     _id: '', 
     count: { $sum: "$numComments" } 
    } 
}) 
{ "result" : [ { "_id" : "", "count" : 8 } ], "ok" : 1 } 
+0

我是新來的MongoDB。那個簡單的代碼...是可怕的。 – otocan

8

可以使用aggregation framework爲的aggregate方法:

db.test.aggregate(
    // Only include docs with at least one comment. 
    {$match: {'comments.0': {$exists: true}}}, 
    // Duplicate the documents, 1 per comments array entry 
    {$unwind: '$comments'}, 
    // Group all docs together and count the number of unwound docs, 
    // which will be the same as the number of comments. 
    {$group: {_id: null, count: {$sum: 1}}} 
); 

UPDATE

由於MongoDB的2.6的,有做更有效的方法這通過使用$size彙總運算符來直接獲得每個doc中的註釋數量:

db.test.aggregate(
    {$group: {_id: null, count: {$sum: {$size: '$comments'}}}} 
); 
相關問題