sql >> Base de Datos >  >> NoSQL >> MongoDB

cómo ordenar una matriz de objetos por lista arbitraria en mongo

Podría intentar ejecutar una función de comparación personalizada con JavaScript nativo sort() en la matriz devuelta por el cursor.toArray() método:

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

Salida de muestra

[
    {
        "_id" : "4JW7miNITl",
        "category" : "food"
    },
    {
        "_id" : "4Je4kmrrbZ",
        "category" : "coffee"
    },
    {
        "_id" : "4JgAh3N86x",
        "category" : "coffee"
    },
    {
        "_id" : "4JEEuhNIae",
        "category" : "grocery"
    }
]

Con la nueva versión de MongoDB 3.4, debería poder aprovechar el uso de los operadores nativos de MongoDB $addFields y $indexOfArray en el marco de agregación.

  • El $addFields El paso de canalización le permite $project nuevos campos a documentos existentes sin conocer todos los demás campos existentes.
  • El $indexOfArray expresión devuelve la posición de un elemento particular en una matriz determinada.

Entonces, poniendo eso en conjunto, podría intentar la siguiente operación agregada (con MongoDB 3.4):

var order = ["food", "coffee", "grocery"],
    projection = { 
        "$addFields" : { 
            "__order" : { "$indexOfArray" : [ order, "$category" ] } 
        } 
    },
    sort = { "$sort" : { "__order" : 1 } };
db.collection.aggregate([ projection, sort]);