MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

come ordinare una matrice di oggetti in base a un elenco arbitrario in mongo

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