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
tags
Attribut 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
}