MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

comment trier un tableau d'objets par liste arbitraire dans mongo

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]);