Ja, es ist mit Aggregation Framework möglich.
Annahmen
- Der hier verwendete Datensatz ist derselbe, der in "Dokumente mit Tags in der Liste abrufen" verwendet wird, sortiert nach der Gesamtzahl der Übereinstimmungen
tagsAttribut ist eine Menge (keine wiederholten Elemente)
Abfrage
Dieser Ansatz zwingt Sie, die Ergebnisse abzuwickeln und das Übereinstimmungsprädikat mit abgewickelten Ergebnissen neu zu bewerten, also ist es wirklich ineffizient.
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}}
);
Erwartete Ergebnisse
{
"result" : [
{
"_id" : {
"_id" : ObjectId("5051f1786a64bd2c54918b26")
},
"matches" : 3
},
{
"_id" : {
"_id" : ObjectId("5051f1726a64bd2c54918b24")
},
"matches" : 2
},
{
"_id" : {
"_id" : ObjectId("5051f1756a64bd2c54918b25")
},
"matches" : 1
}
],
"ok" : 1
}