Las operaciones de agregación con el comando aggregate presentan las siguientes limitaciones.
Restricciones del tamaño de los resultados
El comando aggregate puede devolver un cursor o almacenar los resultados en una colección. Cada documento en el conjunto de resultados está sujeto al 16 límite de tamaño de documento BSON de mebibytes. Si algún documento supera el límite de tamaño del documento BSON, la agregación produce un error. El límite solo se aplica a los documentos devueltos. Durante el Procesamiento de la pipeline, los documentos pueden exceder este tamaño. El db.collection.aggregate() método devuelve un cursor por defecto.
Restricciones en el número de etapas
MongoDB limita el número de etapas de la canalización de agregación permitidas en un solo pipeline a 1000.
Si un pipeline de agregación supera el límite de etapa antes o después de ser analizada, se recibe un error.
Restricciones de memoria
A partir de MongoDB 6.0, el parámetro allowDiskUseByDefault controla si las etapas del pipeline que requieren más de 100 megabytes de memoria para ejecutarse guardan archivos temporales en disco por defecto.
Si
allowDiskUseByDefaultse establece entrue, las etapas del pipeline que requieren más de 100 megabytes de memoria para ejecutarse guardan archivos temporales en el disco por defecto. Puedes desactivar la escritura de archivos temporales en el disco para comandos específicosfindoaggregateutilizando la opción{ allowDiskUse: false }.Si
allowDiskUseByDefaultse establece enfalse, las etapas de la pipeline que requieren más de 100 megabytes de memoria para ejecutarse generan un error por defecto. Puedes habilitar la escritura de archivos temporales en disco parafindoaggregateespecíficos usando la opción{ allowDiskUse: true }.
La $search etapa de agregación no está restringida a 100 megabytes de RAM porque se ejecuta en un proceso separado.
Estos son algunos ejemplos de las etapas que pueden guardar archivos temporales en el disco cuando allowDiskUse está en true:
$sortcuando la operación de ordenación no está soportada por un índice
Nota
Las etapas del pipeline operan en flujos de documentos, donde cada etapa del pipeline toma documentos, los procesa y luego produce los documentos resultantes.
Algunas etapas no pueden generar ningún documento hasta que hayan procesado todos los documentos entrantes. Estas etapas del pipeline deben mantener su salida en la RAM hasta que se procesen todos los documentos entrantes. Como resultado, estas etapas de la pipeline pueden requerir más espacio que el límite de 100 MB.
Si los resultados de una de las etapas del pipeline $sort exceden el límite, se debe considerar agregar una etapa $limit.
Además del límite por etapa, una sola operación no puede utilizar más memoria que el límite de memoria por operación.
Los mensajes de registro del Perfilador y los mensajes de registro de diagnóstico incluyen un indicador usedDisk si alguna etapa de agregación guardó datos en archivos temporales debido a restricciones de memoria.
Límite de memoria por operación
A partir de MongoDB 9.0, MongoDB limita la cantidad total de memoria que puede usar una sola operación de consulta. El límite se aplica a la memoria combinada de todas las etapas de la operación que se monitorizan.
La memoria rastreada incluye:
Evaluación de la expresión
Etapas de ejecución de consultas que almacenan registros en búfer, como búsquedas de proximidad geoespacial, recuentos que utilizan un índice y actualizaciones.
Por defecto, el límite es de 1 gigabytes o 20% de la memoria disponible para el proceso del servidor, lo que sea mayor. MongoDB establece el valor predeterminado al iniciar el servidor.
El límite por operación es independiente del límite de memoria de 100 megabytes por etapa y no modifica la forma en que las etapas se escriben en el disco. Para obtener más información sobre el límite por etapa, consulte Restricciones de memoria.
Si una operación supera el límite por operación, MongoDB finaliza la operación y devuelve uno de los siguientes errores:
QueryExceededMemoryLimitNoDiskUseAllowedcuando una etapa que puede volcarse al disco excede el límite yallowDiskUseesfalse. Ejecute la operación con{ allowDiskUse: true }para que la etapa se volque al disco en lugar de fallar.ExceededMemoryLimitpara otras operaciones que superen el límite.
La mayoría de las operaciones utilizan mucha menos memoria que el límite. Si una operación devuelve un error de límite de memoria, reduzca la memoria que requiere realizando una o más de las siguientes acciones:
Utilice un índice para cumplir con el requisito de ordenación, de modo que MongoDB no ordene los documentos en memoria. Para obtener más información, consulte Ordenación y uso de índices.
Agregue una etapa
$limitdespués de una etapa$sortpara que la ordenación conserve solo los documentos necesarios. Para obtener más información, consulte Optimización de memoria con $sort y $limit.Filtre los documentos con
$matchlo antes posible en el proceso para que las etapas posteriores procesen menos documentos. Para obtener más información, consulte Optimización del proceso de agregación.
Para comprobar el uso de memoria por operación, utilice estas métricasserverStatus: