Operações de agregação com o comando aggregate têm as seguintes limitações.
Restrições de tamanho de resultado
O comando pode retornar um cursor ou armazenar os resultados em uma aggregate coleta. Cada documento no conjunto de resultados está sujeito ao 16 limite de tamanho de documento JSON de mebibytes. Se qualquer documento exceder o limite de Tamanho de Documento JSON, a agregação produz um erro. O limite aplica-se apenas aos documentos devolvidos. Durante o processamento do pipeline, os documentos podem exceder esse tamanho. O método retorna um cursor por db.collection.aggregate() padrão.
Restrições do número de estágios
O MongoDB limita o número de fases do pipeline de agregação permitidos em um único pipeline a 1000.
Se um pipeline de agregação exceder o limite de estágio antes ou depois de ser analisado, você receberá um erro.
Restrições de memória
A partir do MongoDB 6.0, o parâmetro allowDiskUseByDefault controla se os estágios do pipeline que exigem mais de 100 megabytes de memória para execução de arquivos de escrita temporários no disco por padrão.
Se
allowDiskUseByDefaultfor definido comotrue, os estágios do pipeline que exigem mais de 100 megabytes de memória para serem executados gravam arquivos temporários no disco por padrão. Você pode desabilitar a gravação de arquivos temporários em disco para comandosfindouaggregateespecíficos usando a opção{ allowDiskUse: false }.Se
allowDiskUseByDefaultfor definido comofalse, os estágios do pipeline que exigem mais de 100 megabytes de memória para serem executados geram um erro por padrão. Você pode ativar a gravação de arquivos temporários em disco parafindouaggregateespecíficos usando a opção{ allowDiskUse: true }.
O estágio de agregação $search não está restrito a 100 megabytes de RAM porque é executado em um processo separado.
Exemplos de estágios que podem escrever arquivos temporários no disco quando o allowDiskUse é true são:
$sortquando a operação de classificação não é suportada por um índice
Observação
Os estágios de pipeline operam em fluxos de documentos, em que cada estágio de pipeline recebe documentos, processa-os e, em seguida, gera os documentos resultantes.
Alguns estágios podem não gerar documentos até que tenham processado todos os documentos recebidos. Esses estágios do pipeline devem armazenar os resultados na memória RAM até que todos os documentos recebidos sejam processados. Como resultado, estes estágios do pipeline podem exigir mais espaço do que o limite de 100 MB.
Se os resultados de um dos seus $sort estágios do pipeline excederem o limite, considere adicionar um estágio $limit.
Além do limite por estágio, uma única operação não pode usar mais memória do que o limite de memória por operação.
As mensagens de registro do criador de perfil e as mensagens de registro de diagnóstico incluem um indicador usedDisk se algum estágio de agregação gravou dados em arquivos temporários devido a restrições de memória.
$push Limite de memória do acumulador
O acumulador $push não pode gravar arquivos temporários em disco. O parâmetro de servidor internalQueryMaxPushBytes controla o limite de memória $push e, se o array acumulado exceder esse limite, o MongoDB retornará um erro mesmo quando allowDiskUse for true. Por padrão, o parâmetro é 104857600 bytes (100 megabytes). Você pode aumentar o limite em tempo de execução com o comando setParameter, até um máximo de 2147483647 bytes.
Limite de memória por operação
A partir do MongoDB 9.0, O MongoDB limita a quantidade total de memória que uma única operação de query pode usar. O limite se aplica à memória combinada de todos os estágios da operação que possuem monitoramento de memória.
A memória rastreada inclui:
Avaliação de expressão
Estágios de execução de query que armazenam registros em buffer, como pesquisas de proximidade geoespacial, contagens que usam um índice e atualizar
Por padrão, o limite é de 1 gigabyte ou 20% da memória disponível para o processo do servidor, o que for maior. O MongoDB define o padrão quando o servidor é iniciado.
Para alterar o limite por operação, defina o parâmetro internalQueryMaxMemoryUsageBytesPerOperation na inicialização, em tempo de execução ou com configurações de query.
Para expressões que consomem muita memória e que não são cobertas pelo limite por operação, o MongoDB aplica um limite na memória máxima que um subconjunto de expressões pode usar. O padrão desse limite é 100 megabytes. Para alterar esse limite, defina o parâmetro internalQueryMaxSingleExpressionMemoryUsageBytes na inicialização ou em tempo de execução.
O limite por operação é separado do limite de memória por estágio de 100 megabytes e não altera como os estágios são despejados no disco. Para aprender sobre o limite por estágio, consulte Restrições de memória.
Se uma operação exceder o limite por operação, o MongoDB encerra a operação e retorna um dos seguintes erros:
QueryExceededMemoryLimitNoDiskUseAllowedquando um estágio que pode ser gravado em disco excede o limite eallowDiskUseéfalse. Execute a operação com{ allowDiskUse: true }para que o estágio seja gravado em disco em vez de falhar.ExceededMemoryLimitpara outras operações que excedam o limite.
A maioria das operações usa muito menos memória do que o limite. Se uma operação retornar um erro de limite de memória, reduza a memória necessária para a operação realizando uma ou mais das seguintes ações:
Use um índice para satisfazer a classificação para que o MongoDB não classifique os documentos na memória. Para saber mais, consulte Uso de Classificação e Índice.
Adicione um estágio
$limitapós um estágio$sortpara que a classificação mantenha apenas os documento de que você precisa. Para aprender mais, consulte Otimização de memória de $sort e $limit.Filtro documentos com
$matcho mais cedo possível no pipeline para que os estágios posteriores processem menos documentos. Para saber mais, consulte Otimização do pipeline de agregação.
Para verificar o uso de memória por operação, use estas métricas serverStatus: