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

Como classificar uma coleção usando o último elemento de uma matriz


Se possível, sugiro que você sempre (duplo) armazene o valor que deseja classificar. Coloque-o no array e em um segundo campo. Sempre que você enviar um novo valor para a matriz (ou armazenar a matriz), adicione um novo campo correspondente ao "último valor na matriz" e, em seguida, indexe e classifique nele. No exemplo abaixo, chamei de 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" : [ ] }

Crie um índice:
db.so.ensureIndex({lastR: 1})

E depois use:
> 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á muito mais versátil e expansível do que tentar usar uma solução de agregação (que terá um limite de 16 MB para o conjunto de resultados e torna muito mais complexo recuperar documentos complexos quando precisar lidar com uma projeção).