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

Cómo ordenar una colección usando el último elemento de una matriz

Si es posible, le sugiero que siempre almacene (doble) el valor que desea ordenar. Póngalo en la matriz y en un segundo campo. Cada vez que inserte un nuevo valor en la matriz (o almacene la matriz), agregue un nuevo campo correspondiente al "último valor en la matriz" y luego indexe y ordene eso. En el siguiente ejemplo, lo llamé lastR :

{ "value" : -10, "r" : [ { "v" : 1 }, { "v" : 3 } ], "lastR": 3 }
{ "value" : 2, "r" : [ { "v" : 4 }, { "v" : 1 } ], "lastR": 1 }
{ "value" : -100, "r" : [ { "v" : 4 }, { "v" : 1 }, { "v" : 10 } ], "lastR": 10 }
{ "value" : -3, "r" : [ ] }

Crear un índice:

db.so.ensureIndex({lastR: 1})

Y luego usa:

> db.so.find().sort({lastR: 1})
{ "_id" : ObjectId("5203a1c83c5438af60de63a1"), "value" : -3, "r" : [ ] }
{ "_id" : ObjectId("5203a1ad3c5438af60de639f"), "value" : 2, "r" : [ { "v" : 4 }, { "v" : 1 } ], "lastR" : 1 }
{ "_id" : ObjectId("5203a1d33c5438af60de63a2"), "value" : -10, "r" : [ { "v" : 1 }, { "v" : 3 } ], "lastR" : 3 }
{ "_id" : ObjectId("5203a1b73c5438af60de63a0"), "value" : -100, "r" : [ { "v" : 4 }, { "v" : 1 }, { "v" : 10 } ], "lastR" : 10 }

Será mucho más versátil y ampliable que tratar de usar una solución de agregación (que tendrá un límite de 16 MB para el conjunto de resultados y hace que sea mucho más complejo recuperar documentos complejos cuando se necesita lidiar con una proyección).