Du kan prøve at køre en brugerdefineret komparatorfunktion med det oprindelige JavaScript sort()
metode på arrayet returneret fra
var order =["mad", "kaffe", "købmand"];var docs =db.collection.find().toArray().sort(function(a, b) { returordre. indexOf(a.category) - order.indexOf(b.category);});printjson(docs);
Eksempeloutput
[ { "_id" :"4JW7miNITl", "category" :"mad" }, { "_id" :"4Je4kmrrbZ", "category" :"kaffe" }, { "_id" :"4JgAh3N86x ", "category" :"kaffe" }, { "_id" :"4JEEuhNIae", "category" :"købmand" }]
Med den nye MongoDB 3.4-version burde du kunne udnytte brugen af de oprindelige MongoDB-operatører $addFields
og $indexOfArray
i aggregeringsrammen.
$addFields
pipeline-trin giver dig mulighed for at$ projekt
nye felter til eksisterende dokumenter uden at kende alle de andre eksisterende felter.$indexOfArray
udtryk returnerer et bestemt elements position i en given matrix.
Så for at sætte det sammen, kan du prøve følgende samlede operation (med MongoDB 3.4):
var order =["mad", "kaffe", "købmand"], projection ={ "$addFields" :{ "__order" :{ "$indexOfArray" :[ ordre, "$category" ] } } }, sort ={ "$sort" :{ "__order" :1 } };db.collection.aggregate([ projektion, sort]);