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

mongodb:la mejor manera de obtener documentos específicos y luego el resto

Bueno, no hay muchos detalles aquí, pero puedo dar un caso de muestra para su consideración. Considere el siguiente 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" }

Así que suponga que quiere burbujear los elementos para los usuarios "facturan" y "ted" en la parte superior de sus resultados, luego todo lo demás ordenado por el user y el color . Lo que puede hacer es ejecutar los documentos a través de un $project etapa en conjunto, de la siguiente manera:

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 }}

])

Entonces, lo que hace es asignar condicionalmente un valor a weight en función de si el user coincidió con uno de los valores requeridos. Los documentos que no coinciden simplemente reciben un 0 valor.

Cuando movemos esta modificada documento en el $sort fase, el nuevo weight La tecla se puede usar para ordenar los resultados, de modo que los documentos "ponderados" estén en la parte superior, y todo lo demás seguirá.

Hay bastantes cosas que puede hacer para $project un peso de esta manera. Consulte la referencia del operador para obtener más información:

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