MapReduceとそれをクライアント側で実行するのは遅すぎるでしょう-集約フレームワークを使用する必要があります(MongoDB 2.2の新機能)。
次のようになります:
db.collection.aggregate([
{ $match : { "tags": { "$in": ["bar", "hello"] } } },
{ $unwind : "$tags" },
{ $match : { "tags": { "$in": ["bar", "hello"] } } },
{ $group : { _id: "$title", numRelTags: { $sum:1 } } },
{ $sort : { numRelTags : -1 } }
// optionally
, { $limit : 10 }
])
1番目と3番目のパイプラインメンバーは同じように見えることに注意してください。これは意図的であり、必要です。手順は次のとおりです。
- タグ「bar」または「hello」が含まれているドキュメントのみを渡します。
- タグ配列を巻き戻します(タグ要素ごとに1つのドキュメントに分割することを意味します
- 「bar」または「hello」のタグのみを渡す(つまり、残りのタグを破棄する)
- タイトルでグループ化(「$ _ id」または元のドキュメントのその他の組み合わせで、(「bar」と「hello」の)タグの数を合計することもできます
- 関連するタグの数で降順で並べ替えます
- (オプションで)返されるセットをトップ10に制限します。