如果我的集合看起來像這樣,如何獲取集合中的全部評論。 (不是每個職位,但總總的意見的收集。)獲取集合中的子文檔總數
{
_id: 1,
post: 'content',
comments: [
{
name: '',
comment: ''
}
]
}
如果我有立柱A 3組的意見和後B帶5層的意見。結果應該是8
如果我的集合看起來像這樣,如何獲取集合中的全部評論。 (不是每個職位,但總總的意見的收集。)獲取集合中的子文檔總數
{
_id: 1,
post: 'content',
comments: [
{
name: '',
comment: ''
}
]
}
如果我有立柱A 3組的意見和後B帶5層的意見。結果應該是8
您可以使用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 }
可以使用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'}}}}
);
我是新來的MongoDB。那個簡單的代碼...是可怕的。 – otocan