MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

como classificar array de objetos por lista arbitrária no mongo


Você pode tentar executar uma função de comparação personalizada com o JavaScript nativo sort() método na matriz retornada do 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);

Saída de amostra
[
    {
        "_id" : "4JW7miNITl",
        "category" : "food"
    },
    {
        "_id" : "4Je4kmrrbZ",
        "category" : "coffee"
    },
    {
        "_id" : "4JgAh3N86x",
        "category" : "coffee"
    },
    {
        "_id" : "4JEEuhNIae",
        "category" : "grocery"
    }
]

Com a nova versão do MongoDB 3.4, você poderá aproveitar o uso dos operadores nativos do MongoDB $addFields e $indexOfArray no quadro de agregação.
  • O $addFields etapa do pipeline permite que você $project novos campos para documentos existentes sem conhecer todos os outros campos existentes.
  • O $indexOfArray expressão retorna a posição de um determinado elemento em um determinado array.

Então, colocando tudo isso, você pode tentar a seguinte operação agregada (com o MongoDB 3.4):
var order = ["food", "coffee", "grocery"],
    projection = { 
        "$addFields" : { 
            "__order" : { "$indexOfArray" : [ order, "$category" ] } 
        } 
    },
    sort = { "$sort" : { "__order" : 1 } };
db.collection.aggregate([ projection, sort]);