Potresti provare a eseguire una funzione di confronto personalizzata con il JavaScript nativo sort()
metodo sull'array restituito da cursor.toArray()
metodo:
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);
Risultato campione
[
{
"_id" : "4JW7miNITl",
"category" : "food"
},
{
"_id" : "4Je4kmrrbZ",
"category" : "coffee"
},
{
"_id" : "4JgAh3N86x",
"category" : "coffee"
},
{
"_id" : "4JEEuhNIae",
"category" : "grocery"
}
]
Con la nuova versione di MongoDB 3.4, dovresti essere in grado di sfruttare l'uso degli operatori MongoDB nativi $addFields
e $indexOfArray
nel quadro di aggregazione.
- Il
$addFields
il passaggio della pipeline ti consente di$project
nuovi campi a documenti esistenti senza conoscere tutti gli altri campi esistenti. - Il
$indexOfArray
espressione restituisce la posizione di un particolare elemento in un dato array.
Quindi, mettendo tutto insieme, potresti provare la seguente operazione di aggregazione (con MongoDB 3.4):
var order = ["food", "coffee", "grocery"],
projection = {
"$addFields" : {
"__order" : { "$indexOfArray" : [ order, "$category" ] }
}
},
sort = { "$sort" : { "__order" : 1 } };
db.collection.aggregate([ projection, sort]);