获取集合中的子文档总数

时间:2013-02-03 02:02:10

标签: mongodb

如果我的集合看起来像这样,我如何获得集合中的总评论。 (不是每篇帖子的总评论数,而是该集合的总评论数。)

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

如果我发布了有3条评论的A,则发布了5条评论。结果应为8。

2 个答案:

答案 0 :(得分:14)

您可以使用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 }

答案 1 :(得分:9)

您可以使用aggregation frameworkaggregate方法:

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

<强>更新

从MongoDB 2.6开始,通过使用$size聚合运算符直接获取每个文档中的注释数量,有一种更有效的方法:

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