aggregate 명령을 사용한 집계 작업에는 다음과 같은 제한 사항이 있습니다.
결과 크기 제한
aggregate 명령은 커서 반환하거나 결과를 컬렉션 에 저장 수 있습니다. 결과 설정하다 의 각 문서 에는 16 메비바이트 BSON 문서 크기 제한이 적용됩니다. 단일 문서 BSON 문서 크기 제한을 초과하는 경우 집계 오류가 발생합니다. 이 한도는 반환된 문서에만 적용됩니다. 파이프라인 처리 중에 문서가 이 크기를 초과할 수 있습니다. db.collection.aggregate() 메서드는 기본값 으로 커서 반환합니다.
단계 수 제한
MongoDB는 단일 파이프라인에서 허용되는 집계 파이프라인 단계 수를 1000개로 제한합니다.
집계 파이프라인이 구문 분석 전후에 단계 제한을 초과하면 오류가 발생합니다.
메모리 제한
MongoDB 6.0부터 allowDiskUseByDefault 매개변수는 실행에 100메가바이트 이상의 메모리가 필요한 파이프라인 단계에서 기본적으로 디스크에 임시 파일 쓰기를 수행할지 여부를 제어합니다.
allowDiskUseByDefault를true로 설정하면 실행하는 데 100메가바이트 이상의 메모리가 필요한 파이프라인 단계에서는 기본적으로 임시 파일을 디스크에 씁니다.{ allowDiskUse: false }옵션을 사용하여 특정find또는aggregate명령에 대해 디스크에 임시 파일 쓰기를 비활성화할 수 있습니다.allowDiskUseByDefault를false로 설정하면 실행하는 데 100메가바이트 이상의 메모리가 필요한 파이프라인 단계는 기본적으로 오류가 발생합니다.{ allowDiskUse: true }옵션을 사용하여 특정find또는aggregate에 대한 임시 파일을 디스크에 쓸 수 있도록 설정할 수 있습니다.
$search 집계 단계는 별도의 프로세스에서 실행되므로 100 메가바이트의 RAM으로 제한되지 않습니다.
허용 디스크 사용이 true일 때 디스크에 임시 파일을 쓸 수 있는 단계의 예시는 다음과 같습니다.
$sort인덱스에서 정렬 작업을 지원하지 않는 경우
참고
파이프라인 단계는 각 파이프라인 단계가 문서를 가져와 처리한 후 결과 문서를 출력하는 문서 스트림에서 작동합니다.
일부 단계에서는 들어오는 문서를 모두 처리할 때까지 문서를 출력할 수 없습니다. 이러한 파이프라인 단계는 들어오는 모든 문서가 처리될 때까지 단계 출력을 RAM에 보관해야 합니다. 따라서 이러한 파이프라인 단계에는 100MB 제한보다 더 많은 공간이 필요할 수 있습니다.
$sort 파이프라인 단계 중 하나의 결과가 한도를 초과하는 경우 $limit 단계를 추가하는 것을 고려하세요.
단계별 제한 외에도 단일 작업은 작업당 메모리 제한보다 많은 메모리를 사용할 수 없습니다.
프로파일러 로그 메시지 및 진단 로그 메시지에는 메모리 제한으로 인해 집계 단계에서 임시 파일에 데이터를 쓴 경우 usedDisk 표시기가 포함됩니다.
$push 축적자 메모리 제한
$push 축적자는 임시 파일을 디스크에 쓰기 (write) 수 없습니다. internalQueryMaxPushBytes 서버 매개변수는 $push 메모리 제한을 제어하며, 누적된 배열이 해당 제한을 초과하면 allowDiskUse가 true인 경우에도 MongoDB는 오류를 반환합니다. 기본값은 104857600 바이트(100 메가바이트)입니다. 런타임 시 setParameter 명령을 사용하여 최대 2147483647 바이트까지 제한을 높일 수 있습니다.
작업별 메모리 제한
MongoDB 9.0부터, MongoDB는 단일 쿼리 작업이 사용할 수 있는 총 메모리 양을 제한합니다. 이 제한은 작업의 모든 메모리 추적 단계의 결합된 메모리에 적용됩니다.
추적된 메모리에는 다음이 포함됩니다:
표현식 평가
지리 공간적 근접성 검색, 인덱스를 사용하는 카운트, 업데이트와 같이 기록을 버퍼링하는 쿼리 실행 단계
기본값은 1 기가바이트 또는 서버 프로세스에서 사용할 수 있는 메모리의 20% 중 더 큰 값입니다. MongoDB는 서버가 시작될 때 기본값을 설정합니다.
작업당 제한을 변경하려면 스타트업 시, 런타임에 또는 쿼리 설정에서 internalQueryMaxMemoryUsageBytesPerOperation 매개변수를 설정하세요.
작업별 제한이 적용되지 않는 메모리 집약적 표현식의 경우, MongoDB는 표현식의 하위 집합이 사용할 수 있는 최대 메모리에 제한을 적용합니다. 이 제한의 기본값은 100 메가바이트입니다. 이 제한을 변경하려면 스타트업 시 또는 런타임에 internalQueryMaxSingleExpressionMemoryUsageBytes 매개변수를 설정하세요.
작업당 제한은 100 MB(메가바이트) 단계당 메모리 제한과 별개이며, 단계가 디스크로 유출되는 방식을 변경하지 않습니다. 단계별 제한에 대해 학습하려면 메모리 제한.을 참조하세요.
작업이 작업당 제한을 초과하면 MongoDB는 해당 작업을 종료하고 다음 오류 중 하나를 반환합니다.
디스크로 스필될 수 있는 단계가 제한을 초과하고
allowDiskUse이(가)false인 경우QueryExceededMemoryLimitNoDiskUseAllowed입니다. 실패하는 대신 단계가 디스크로 스필되도록{ allowDiskUse: true }을(를) 사용하여 작업을 실행합니다.ExceededMemoryLimit제한을 초과하는 다른 작업의 경우.
대부분의 작업은 제한보다 훨씬 적은 메모리를 사용합니다. 작업이 메모리 제한 오류를 반환하는 경우 다음 조치 중 하나 이상을 수행하여 작업에 필요한 메모리를 줄이십시오.
MongoDB가 메모리에서 문서를 정렬하지 않도록 인덱스를 사용하여 정렬을 충족합니다. 자세한 사항은 정렬 및 인덱스 사용 항목을 참조하십시오.
단계
$limit$sort뒤에 단계를 추가하여 정렬이 필요한 문서만 유지하도록 합니다. 자세한 내용은 $sort 및 $limit 메모리 최적화를 참조하세요.파이프라인의 초기 단계에서
$match를 사용한 문서 필터로 이후 단계에서 처리할 문서의 수를 줄일 수 있습니다. 자세한 내용은 집계 파이프라인 최적화를 참조하세요.
작업별 메모리 사용량을 확인하려면 다음 serverStatus 지표를 사용하세요.