Los índices almacenan entradas en orden ascendente (1), o por orden descendente (-1). Para índices compuestos, el orden de clasificación puede determinar si el índice puede soportar una operación de ordenación. La dirección de un campo en un índice compuesto solo es relevante si hay un orden en varios campos en direcciones opuestas.
Los índices compuestos admiten operaciones de ordenación que coinciden con el orden de clasificación del índice o con el orden de clasificación inverso del índice.
Para obtener información sobre el orden de clasificación e índices, consulte Usar índices para ordenar los resultados de query.
Caso de uso
Un juego móvil cuenta con una tabla de clasificación que muestra la siguiente información:
Puntuaciones más altas del juego
El usuario que logró cada puntaje
La fecha en la que se logró cada puntuación
La aplicación clasifica la tabla de posiciones primero por score en orden descendente. Luego, el username asociado a cada score se ordena de forma ascendente (alfabéticamente).
Un índice compuesto puede mejorar el rendimiento de la tabla de clasificación si el orden de clasificación del índice coincide con el orden de clasificación de la query.
Ejemplo
Considera una colección leaderboard con estos documentos:
db.leaderboard.insertMany( [ { "score": 50, "username": "Alex Martin", "date": ISODate("2022-03-01T00:00:00Z") }, { "score": 55, "username": "Laura Garcia", "date": ISODate("2022-03-02T00:00:00Z") }, { "score": 60, "username": "Alex Martin", "date": ISODate("2022-03-03T00:00:00Z") }, { "score": 60, "username": "Riya Patel", "date": ISODate("2022-03-04T00:00:00Z") }, { "score": 50, "username": "Laura Garcia", "date": ISODate("2022-03-05T00:00:00Z") } ] )
Esta query devuelve resultados de la tabla de clasificación:
db.leaderboard.find().sort( { score: -1, username: 1 } )
Salida:
[ { _id: ObjectId("632235700646eaee87a56a74"), score: 60, username: 'Alex Martin', date: ISODate("2022-03-03T00:00:00.000Z") }, { _id: ObjectId("632235700646eaee87a56a75"), score: 60, username: 'Riya Patel', date: ISODate("2022-03-04T00:00:00.000Z") }, { _id: ObjectId("632235700646eaee87a56a73"), score: 55, username: 'Laura Garcia', date: ISODate("2022-03-02T00:00:00.000Z") }, { _id: ObjectId("632235700646eaee87a56a72"), score: 50, username: 'Alex Martin', date: ISODate("2022-03-01T00:00:00.000Z") }, { _id: ObjectId("632235700646eaee87a56a76"), score: 50, username: 'Laura Garcia', date: ISODate("2022-03-05T00:00:00.000Z") } ]
Los resultados se ordenan primero por puntuación en orden descendente y luego por nombre de usuario en orden ascendente (alfabéticamente).
Índice de soporte para la clasificación
El siguiente índice mejora el rendimiento de los resultados de la tabla de clasificación porque el orden de clasificación del índice coincide con el orden de clasificación utilizado en la query:
db.leaderboard.createIndex( { score: -1, username: 1 } )
Este índice compuesto almacena:
scorevalores en orden descendente.usernamevalores en orden ascendente (alfabético).
Resultados inversos
MongoDB puede recorrer un índice compuesto en cualquier dirección. Si la aplicación permite a los usuarios ver la tabla de clasificación en orden inverso, el índice también soporta esa query.
La siguiente query devuelve el ranking en orden inverso, donde los resultados se ordenan primero por valores ascendentes de score y luego por valores descendentes de username (inverso alfabético):
db.leaderboard.find().sort( { score: 1, username: -1 } )
Salida:
[ { _id: ObjectId("632235700646eaee87a56a76"), score: 50, username: 'Laura Garcia', date: ISODate("2022-03-05T00:00:00.000Z") }, { _id: ObjectId("632235700646eaee87a56a72"), score: 50, username: 'Alex Martin', date: ISODate("2022-03-01T00:00:00.000Z") }, { _id: ObjectId("632235700646eaee87a56a73"), score: 55, username: 'Laura Garcia', date: ISODate("2022-03-02T00:00:00.000Z") }, { _id: ObjectId("632235700646eaee87a56a75"), score: 60, username: 'Riya Patel', date: ISODate("2022-03-04T00:00:00.000Z") }, { _id: ObjectId("632235700646eaee87a56a74"), score: 60, username: 'Alex Martin', date: ISODate("2022-03-03T00:00:00.000Z") } ]
El índice { score: -1, username: 1 } admite esta query.
Consultas no admitidas
Los índices compuestos no pueden soportar consultas donde el orden de clasificación no coincida con el índice o con el orden inverso del índice. Como resultado, el índice { score:
-1, username: 1 } no puede admitir la ordenación por valores score ascendentes y luego por valores username ascendentes, como en esta query:
db.leaderboard.find().sort( { score: 1, username: 1 } )
Además, para que una operación de ordenamiento utilice un índice, los campos especificados en el ordenamiento deben aparecer en el mismo orden en que aparecen en un índice. Como resultado, el índice anterior no puede soportar esta query:
db.leaderboard.find().sort( { username: 1, score: -1, } )
Obtén más información
Para obtener más información sobre el orden de clasificación e índices, consulte Utilizar Índices para Clasificar Resultados de queries.
Para obtener más información sobre la clasificación de los resultados de query, consulta
sort().