如果我的集合看起来像这样,我如何获得集合中的总评论。 (不是每篇帖子的总评论数,而是该集合的总评论数。)
{
_id: 1,
post: 'content',
comments: [
{
name: '',
comment: ''
}
]
}
如果我发布了有3条评论的A,则发布了5条评论。结果应为8。
答案 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 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}}}
);
<强>更新强>
从MongoDB 2.6开始,通过使用$size
聚合运算符直接获取每个文档中的注释数量,有一种更有效的方法:
db.test.aggregate(
{$group: {_id: null, count: {$sum: {$size: '$comments'}}}}
);