はい、AggregationFrameworkを使用することは可能です。
前提条件
- ここで使用されるデータセットは、一致の総数順に並べられた、リストにタグが含まれるドキュメントの取得で使用されるものと同じです。
tags
属性はセットです(繰り返される要素はありません)
クエリ
このアプローチでは、結果を巻き戻し、巻き戻された結果を使用して一致述語を再評価する必要があるため、非常に非効率的です。
db.test_col.aggregate(
{$match: {tags: {$in: ["shirt","cotton","black"]}}},
{$unwind: "$tags"},
{$match: {tags: {$in: ["shirt","cotton","black"]}}},
{$group: {
_id:{"_id":1},
matches:{$sum:1}
}},
{$sort:{matches:-1}}
);
期待される結果
{
"result" : [
{
"_id" : {
"_id" : ObjectId("5051f1786a64bd2c54918b26")
},
"matches" : 3
},
{
"_id" : {
"_id" : ObjectId("5051f1726a64bd2c54918b24")
},
"matches" : 2
},
{
"_id" : {
"_id" : ObjectId("5051f1756a64bd2c54918b25")
},
"matches" : 1
}
],
"ok" : 1
}