Usando um Índice Composto para Ordenação
Índices não servem apenas para acelerar consultas; eles também são cruciais para uma ordenação eficiente. Quando você ordena por um campo que não está indexado, o MongoDB precisa realizar a ordenação na memória, o que pode ser lento e consumir RAM significativa. Um índice composto, que inclui múltiplos campos, pode otimizar consultas que filtram e ordenam por esses campos.
Vamos criar um índice composto nos campos city (ascendente) e age (descendente). A ordem dos campos no índice é importante para como ele pode ser utilizado.
db.users.createIndex({ city: 1, age: -1 });
Agora, vamos executar uma consulta que ordena os usuários por cidade e depois por idade. Usaremos .explain() novamente para confirmar que o índice está sendo usado para a ordenação.
db.users.find().sort({ city: 1, age: -1 }).explain("executionStats");
Exemplo de saída (truncada):
{
"queryPlanner": {
"winningPlan": {
"stage": "FETCH",
"inputStage": {
"stage": "IXSCAN",
"keyPattern": { "city": 1, "age": -1 },
"indexName": "city_1_age_-1"
}
}
}
}
O estágio IXSCAN mostra que o MongoDB usou nosso novo índice city_1_age_-1. Como os dados já estão ordenados no índice de acordo com nossos critérios de ordenação, o MongoDB não precisa realizar uma etapa de ordenação separada e custosa na memória.
Para ver o resultado ordenado real, execute a consulta sem .explain().
db.users.find().sort({ city: 1, age: -1 });
Saída:
[
{ _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' }
]
Os documentos estão corretamente ordenados primeiro por city alfabeticamente e depois por age do mais velho para o mais novo dentro de cada cidade, correspondendo à definição do índice composto.