Para responder a tu primera pregunta:$group
no conservar el orden. Hay solicitudes abiertas de cambios que también resaltan un poco los fondos, pero no parece que el producto se cambie para conservar el orden de los documentos de entrada:
- https://jira.mongodb.org/browse/SERVER-24799
- https://jira.mongodb.org/browse/SERVER-4507
- https://jira.mongodb.org/browse/SERVER-21022
En general, se pueden decir dos cosas:por lo general, desea agrupar primero y luego hacer la clasificación. La razón es que ordenar menos elementos (lo que generalmente produce la agrupación) será más rápido que ordenar todos los documentos de entrada.
En segundo lugar, MongoDB se asegurará de clasificar de la manera más eficiente y mínima posible. La documentación estados:
Entonces este código hace el trabajo en su caso:
collection.aggregate({
$group: {
_id: '$age',
names: { $push: '$name' }
}
}, {
$sort: {
'_id': 1
}
}, {
$limit: 10
})
EDITAR siguiendo sus comentarios:
Estoy de acuerdo con lo que dices. Y llevando su lógica un poco más allá, iría tan lejos como para decir:Si $group
fue lo suficientemente inteligente como para usar un índice, entonces ni siquiera debería requerir un $sort
etapa al principio. Desafortunadamente, no lo es (todavía no probablemente). Tal como están las cosas hoy, $group
nunca usará un índice y no tomará atajos basados en las siguientes etapas ($limit
en este caso). También vea este enlace
donde alguien realizó algunas pruebas básicas.
El marco de agregación aún es bastante joven, así que supongo que se está trabajando mucho para que la canalización de agregación sea más inteligente y rápida.
Hay respuestas aquí en StackOverflow (por ejemplo, aquí
) donde las personas sugieren usar un $sort
inicial etapa para "obligar" a MongoDB a usar un índice de alguna manera. Sin embargo, esto ralentizó mis pruebas (1 millón de registros de su forma de muestra usando diferentes distribuciones aleatorias) significativamente.
Cuando se trata del rendimiento de una canalización de agregación, $match
Las etapas al principio son las que realmente ayudan más. Si puede limitar la cantidad total de registros que deben pasar por la canalización desde el principio, entonces esa es su mejor opción, obviamente...;)