Vous pouvez essayer d'exécuter une fonction de comparaison personnalisée avec le JavaScript natif sort()
méthode sur le tableau renvoyé par le cursor.toArray()
méthode :
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);
Exemple de sortie
[
{
"_id" : "4JW7miNITl",
"category" : "food"
},
{
"_id" : "4Je4kmrrbZ",
"category" : "coffee"
},
{
"_id" : "4JgAh3N86x",
"category" : "coffee"
},
{
"_id" : "4JEEuhNIae",
"category" : "grocery"
}
]
Avec la nouvelle version de MongoDB 3.4, vous devriez pouvoir tirer parti de l'utilisation des opérateurs MongoDB natifs $addFields
et $indexOfArray
dans le cadre d'agrégation.
- Le
$addFields
l'étape du pipeline vous permet de$project
de nouveaux champs à des documents existants sans connaître tous les autres champs existants. - Le
$indexOfArray
expression renvoie la position d'un élément particulier dans un tableau donné.
En résumé, vous pouvez essayer l'opération d'agrégation suivante (avec MongoDB 3.4) :
var order = ["food", "coffee", "grocery"],
projection = {
"$addFields" : {
"__order" : { "$indexOfArray" : [ order, "$category" ] }
}
},
sort = { "$sort" : { "__order" : 1 } };
db.collection.aggregate([ projection, sort]);