Sie könnten versuchen, eine benutzerdefinierte Komparatorfunktion mit dem nativen JavaScript sortieren()
-Methode auf dem Array, das von cursor.toArray()
Methode:
var order = ["food", "coffee", "grocery"];
var docs = db.collection.find().toArray().sort(function(a, b) {
return order.indexOf(a.category) - order.indexOf(b.category);
});
printjson(docs);
Beispielausgabe
[
{
"_id" : "4JW7miNITl",
"category" : "food"
},
{
"_id" : "4Je4kmrrbZ",
"category" : "coffee"
},
{
"_id" : "4JgAh3N86x",
"category" : "coffee"
},
{
"_id" : "4JEEuhNIae",
"category" : "grocery"
}
]
Mit der neuen MongoDB-Version 3.4 sollten Sie in der Lage sein, die nativen MongoDB-Operatoren $addFields
und $indexOfArray
im Aggregationsframework.
- Die
$addFields
Pipeline-Schritt ermöglicht Ihnen$ Projekt
neue Felder in vorhandene Dokumente einfügen, ohne alle anderen vorhandenen Felder zu kennen. - Der
$indexOfArray
Ausdruck gibt die Position eines bestimmten Elements in einem gegebenen Array zurück.
Zusammenfassend könnten Sie also die folgende aggregierte Operation (mit MongoDB 3.4) ausprobieren:
var order = ["food", "coffee", "grocery"],
projection = {
"$addFields" : {
"__order" : { "$indexOfArray" : [ order, "$category" ] }
}
},
sort = { "$sort" : { "__order" : 1 } };
db.collection.aggregate([ projection, sort]);