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

mongodb:melhor maneira de obter documentos específicos e depois o resto


Bem, não há muitos detalhes aqui, mas posso dar um exemplo de caso para consideração. Considere o seguinte conjunto de documentos:
{ "user" : "fred", "color" : "black" }
{ "user" : "bill", "color" : "blue" }
{ "user" : "ted", "color" : "red" }
{ "user" : "ted", "color" : "black" }
{ "user" : "fred", "color" : "blue" }
{ "user" : "bill", "color" : "red" }
{ "user" : "bill", "color" : "orange" }
{ "user" : "fred", "color" : "orange" }
{ "user" : "ted", "color" : "orange" }
{ "user" : "ally", "color" : "orange" }
{ "user" : "alice", "color" : "orange" }
{ "user" : "alice", "color" : "red" }
{ "user" : "bill", "color" : "purple" }

Então, suponha que você queira bolha os itens para os usuários "bill" e "ted" no topo de seus resultados, então todo o resto classificado pelo user e a color . O que você pode fazer é executar os documentos por meio de um $project fase agregada, como segue:
db.bubble.aggregate([

    // Project selects the fields to show, and we add a weight value
    {$project: {
        _id: 0,
        "user": 1,
        "color": 1,
        "weight": {$cond:[
            {$or: [
                {$eq: ["$user","bill"]},
                {$eq: ["$user","ted"]}
            ]},
            1,
            0
         ]}
     }},

    // Then sort the results with the `weight` first, then `user` and `color`
    {$sort: { weight: -1, user: 1, color: 1 }}

])

Então, o que isso faz é atribuir condicionalmente um valor a weight com base em se o user correspondia a um dos valores exigidos. Documentos que não correspondem recebem simplesmente um 0 valor.

Quando movemos este modificado documento para o $sort fase, o novo weight key pode ser usado para ordenar os resultados para que os documentos "pesados" fiquem no topo e qualquer outra coisa seguirá.

Há algumas coisas que você pode fazer para $project um peso desta forma. Consulte a referência do operador para obter mais informações:

http://docs.mongodb.org/manual/reference/operator/aggregation/