Oui, c'est possible en utilisant Aggregation Framework.
Hypothèses
- L'ensemble de données utilisé ici est le même que celui utilisé dans Obtenir des documents avec des balises dans la liste, classés par nombre total de correspondances
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
}