Comme je l'ai répondu dans In MongoDB, recherchez dans un tableau et triez par nombre de correspondances
C'est possible en utilisant Aggregation Framework.
Hypothèses
tags
l'attribut est un ensemble (pas d'éléments répétés)
Requête
Cette approche vous oblige à dérouler les résultats et à réévaluer le prédicat de correspondance avec des résultats déroulés, donc c'est vraiment inefficace.
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}}
);
Résultats attendus
{
"result" : [
{
"_id" : {
"_id" : ObjectId("5051f1786a64bd2c54918b26")
},
"matches" : 3
},
{
"_id" : {
"_id" : ObjectId("5051f1726a64bd2c54918b24")
},
"matches" : 2
},
{
"_id" : {
"_id" : ObjectId("5051f1756a64bd2c54918b25")
},
"matches" : 1
}
],
"ok" : 1
}