sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Es posible ordenar, agrupar y limitar de manera eficiente en Mongo con una canalización?

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:

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