7

コレクションが次のようになっている場合、コレクション内の合計コメントを取得するにはどうすればよいですか。(投稿ごとのコメントの合計ではなく、コレクションの合計です。)

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

Aに3つのコメントを投稿し、Bに5つのコメントを投稿した場合。結果は8になります。

4

2 に答える 2

15

集約フレームワークを使用できます:

> 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 }
于 2013-02-03T03:15:19.430 に答える
9

そのために集約フレームワーク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}}}
);

アップデート

$sizeMongoDB 2.6以降、集計演算子を使用して各ドキュメントのコメント数を直接取得することで、これを行うためのより効率的な方法があります。

db.test.aggregate(
  {$group: {_id: null, count: {$sum: {$size: '$comments'}}}}
);
于 2013-02-03T03:13:21.250 に答える