ObjectId _id <--- index String UserName int Points <--- Descending index
Usando esta estructura de documento como un ejemplo simple, tenemos una colección de usuarios, cada uno con un nombre y un valor de "puntos". La colección tiene el índice _id
habitual pero también un "índice descendente" en Points
.
El ejemplo de caso de uso sería mantener un marcador de clasificación (algo así como el sistema de clasificación de League of Legends/DOTA o el sistema de elo de ajedrez). El campo de Points
de cada usuario cambiaría constantemente, pero el marcador se ve con mucha frecuencia y, por lo tanto, debe mantenerse con precisión.
No estoy seguro de qué significa "orden de clasificación ascendente/descendente" en los documentos de mongo , pero aparentemente no importa para los índices de un solo campo de todos modos. Así que actualmente solo estoy haciendo una solución de fuerza bruta para ordenar la colección cada vez que se actualiza el campo Points
de un usuario. Al menos está indexado, por lo que para una base de usuarios más pequeña esto no debería ser tan malo. Sin embargo, clasificar toda la base de usuarios en cada actualización/inserción parece incorrecto en general.
Hay estructuras de datos que se usan tradicionalmente para mantener el orden durante la inserción/actualización, como los árboles de búsqueda, pero implementar eso sin poner toda la colección en la memoria parece un gran proyecto en sí mismo.
Intenté buscar alguna funcionalidad integrada de los índices de Mongo que mantuviera automáticamente el orden en la colección, pero no pude encontrar nada parecido.
¿Tal vez alguna lógica para volver a ordenar solo una parte de los documentos directamente encima y debajo de la inserción/actualización? Esta solución parece bastante dependiente de la distribución esperada de Points
en la base de usuarios y los casos de uso de este sistema.
No necesita ordenar índices ya creados adicionalmente, cuando crea índices en mongoDB, especifica en qué dirección deben ordenarse (ascendente (1) o descendente (-1)), por lo que cuando busca varios documentos en función de algunos campo, el resultado ya estará ordenado en función de este orden de índice de campo. Por supuesto, puede especificar explícitamente si necesita el resultado en orden inverso o ordenado por otro campo.