Usar un Índice Compuesto para Ordenar
Los índices no solo sirven para acelerar las consultas; también son cruciales para una ordenación eficiente. Cuando ordena por un campo que no está indexado, MongoDB debe realizar la ordenación en memoria, lo que puede ser lento y consumir una cantidad significativa de RAM. Un índice compuesto, que incluye varios campos, puede optimizar las consultas que filtran y ordenan por esos campos.
Creemos un índice compuesto en los campos city (ascendente) y age (descendente). El orden de los campos en el índice es importante para cómo se puede utilizar.
db.users.createIndex({ city: 1, age: -1 });
Ahora, ejecutemos una consulta que ordene a los usuarios por ciudad y luego por edad. Usaremos .explain() nuevamente para confirmar que el índice se utiliza para la ordenación.
db.users.find().sort({ city: 1, age: -1 }).explain("executionStats");
Salida de ejemplo (truncada):
{
"queryPlanner": {
"winningPlan": {
"stage": "FETCH",
"inputStage": {
"stage": "IXSCAN",
"keyPattern": { "city": 1, "age": -1 },
"indexName": "city_1_age_-1"
}
}
}
}
La etapa IXSCAN muestra que MongoDB utilizó nuestro nuevo índice city_1_age_-1. Dado que los datos ya están ordenados en el índice según nuestros criterios de ordenación, MongoDB no necesita realizar un paso de ordenación separado y costoso en memoria.
Para ver el resultado ordenado real, ejecute la consulta sin .explain().
db.users.find().sort({ city: 1, age: -1 });
Salida:
[
{ _id: ObjectId("..."), name: 'Charlie', age: 42, city: 'Chicago' },
{ _id: ObjectId("..."), name: 'Alice', age: 28, city: 'New York' },
{ _id: ObjectId("..."), name: 'David', age: 25, city: 'New York' },
{ _id: ObjectId("..."), name: 'Bob', age: 35, city: 'San Francisco' },
{ _id: ObjectId("..."), name: 'Eve', age: 31, city: 'San Francisco' }
]
Los documentos están correctamente ordenados primero por city alfabéticamente y luego por age del más viejo al más joven dentro de cada ciudad, coincidiendo con la definición del índice compuesto.