Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Docs Menu
Docs Home
/ /

Orden de clasificación del índice compuesto

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.

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.

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).

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:

  • score valores en orden descendente.

  • username valores en orden ascendente (alfabético).

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.

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

Volver

Crear

En esta página