Docs Menu
Docs Home
/
MongoDB 매뉴얼
/

MongoDB 제한 및 임계값

이 페이지의 내용

  • MongoDB Atlas 한계
  • BSON 문서
  • 이름 지정 제한 사항
  • 이름 지정 경고
  • 네임스페이스
  • Indexes
  • 정렬
  • 데이터
  • 복제본 세트
  • 샤딩된 클러스터
  • 운영
  • 세션

이 문서는 MongoDB 시스템의 엄격한 한도 및 비교적 유한 한도 모음을 제공합니다. 이 페이지의 한도는 별도로 지정하지 않는 한 다음 환경 모두에서 호스팅되는 배포에 적용됩니다.

  • MongoDB Atlas: 클라우드에서의 MongoDB 배포를 위한 완전 관리형 서비스

  • MongoDB Enterprise: MongoDB의 구독 기반 자체 관리 버전

  • MongoDB Community: MongoDB의 소스 사용 가능 무료 자체 관리 버전

다음 한도는 MongoDB Atlas에서 호스팅되는 배포에만 적용됩니다. 이러한 한도 중 하나라도 사용자의 조직에 문제가 된다면 Atlas 지원팀에 문의하세요.

구성 요소
Limit
12
단일 리전 클러스터의 샤드
50
멀티 리전 클러스터를 위한 리전 간 네트워크 권한
40. 또한 모든 프로젝트의 클러스터는 40개 이상의 지역에 걸쳐 있으므로 이 프로젝트에서는 다중 지역 클러스터를 생성할 수 없습니다.
복제본 세트 또는 샤드당 투표 가능 노드
7
config 서버클러스터 계층(최소 및 최대)
M30

MongoDB Atlas는 클러스터 계층과 클래스에 따라 동시 수신 연결을 제한합니다. MongoDB Atlas 연결 한도는 노드별로 적용됩니다. 샤딩된 클러스터의 경우에는 MongoDB Atlas 연결 한도가 mongos 라우터별로 적용됩니다. mongos 라우터의 수는 모든 샤드에서 합산된 복제본 세트 노드의 수와 같습니다.

읽기 설정은 MongoDB Atlas가 지정된 쿼리에 할당할 수 있는 총 연결 수에도 영향을 미칩니다.

지정된 클러스터 계층에 대한 MongoDB Atlas의 연결 한도는 다음과 같습니다.

MongoDB Atlas 클러스터 계층
노드당 최대 연결 수
M0
500
M2
500
M5
500
M10
1500
M20
3000
M30
3000
M40
6000
M50
16000
M60
32000
M80
96000
M140
96000
M200
128000
M300
128000
MongoDB Atlas 클러스터 계층
노드당 최대 연결 수
M40
4000
M50
16000
M60
32000
M80
64000
M140
96000
M200
128000
M300
128000
M400
128000
M700
128000
MongoDB Atlas 클러스터 계층
노드당 최대 연결 수
M0
500
M2
500
M5
500
M10
1500
M20
3000
M30
3000
M40
6000
M50
16000
M60
32000
M80
64000
M140
96000
M200
128000
M300
128000

참고

MongoDB Atlas는 MongoDB Atlas 서비스를 지원하기 위해 각 클러스터에 대한 소수의 연결을 예약합니다.

비공개 연결을 통해 멀티 클라우드 MongoDB Atlas 배포에 연결하는 경우, 연결 중인 동일한 클라우드 공급자의 노드에만 액세스할 수 있습니다. 이 클라우드 공급자는 해당 리전에 프라이머리 노드가 없을 수 있습니다. 이 경우 연결 문자열에 세컨더리 읽기 설정 모드를 지정하여 배포에 액세스해야 합니다.

현재 제공자에서 비공개 연결을 통해 멀티 클라우드 MongoDB Atlas 배포를 위한 모든 노드에 액세스해야 하는 경우, 다음 작업 중 하나를 수행해야 합니다.

  • 현재 제공업체의 VPN을 나머지 각 제공업체로 구성합니다.

  • 나머지 각 제공자에 대해 MongoDB Atlas에 대한 비공개 엔드포인트를 구성합니다.

단일 MongoDB Atlas 클러스터의 컬렉션 수에 대한 엄격한 한도는 없지만, 많은 수의 컬렉션과 인덱스를 제공하는 경우 클러스터의 성능이 저하될 수 있습니다. 컬렉션이 클수록 성능에 가해지는 영향도 커집니다.

MongoDB Atlas 클러스터 계층별로 권장되는 최대 컬렉션 및 인덱스 수의 총합은 다음과 같습니다.

MongoDB Atlas 클러스터 계층
권장 최대값
M10
5,000개의 컬렉션 및 인덱스
M20 / M30
10,000개의 컬렉션 및 인덱스
M40/+
100,000개의 컬렉션 및 인덱스

MongoDB Atlas 배포에는 다음과 같은 조직 및 프로젝트 한도가 있습니다.

구성 요소
Limit
MongoDB Atlas 프로젝트당 데이터베이스 사용자
100
MongoDB Atlas 프로젝트당 Atlas 사용자
500
MongoDB Atlas 조직당 Atlas 사용자
500
MongoDB Atlas 조직당 API 키
500
MongoDB Atlas 프로젝트당 액세스 목록 항목
200
MongoDB Atlas 팀당 사용자
250
MongoDB Atlas 프로젝트당 팀
100
MongoDB Atlas 조직당 팀
250
MongoDB Atlas 사용자당 팀
100
MongoDB Atlas 사용자당 조직
250
조직 간 구성당 연결된 조직
250
MongoDB Atlas 프로젝트당 클러스터
25
MongoDB Atlas 조직당 프로젝트
250
MongoDB Atlas 프로젝트당 사용자 지정 MongoDB 역할
100
데이터베이스 사용자당 할당된 역할
100
MongoDB Atlas 조직당 시간당 청구
$50
MongoDB Atlas 프로젝트당 연합 데이터베이스 인스턴스
25
MongoDB Atlas 프로젝트당 총 네트워크 피어링 연결
50. 또한, MongoDB Atlas는 프로젝트에 대해 선택된 CIDR 블록과 리전을 기반으로 네트워크 피어링 연결당 노드 수를 제한합니다.
MongoDB Atlas 프로젝트당 보류 중인 네트워크 피어링 연결
25
리전당 AWS Private Link 주소 지정 가능 대상
50
리전당 Azure PrivateLink 주소 지정 가능 대상
150
MongoDB Atlas 관리 글로벌 클러스터 프로젝트당 고유한 샤드 키
40. 이는 Atlas 관리 샤딩을 사용하는 글로벌 클러스터에만 적용됩니다. 자체 관리 샤딩을 사용하는 글로벌 클러스터의 경우 프로젝트당 고유한 샤드 키 수에는 제한이 없습니다.
M0 MongoDB Atlas 프로젝트당 클러스터
1

MongoDB Atlas 서비스 계정에는 다음과 같은 조직 및 프로젝트 한도가 있습니다.

구성 요소
Limit
MongoDB Atlas 조직 당 Atlas 서비스 계정
200
MongoDB Atlas 서비스 계정당 액세스 목록 항목
200
MongoDB Atlas 서비스 계정당 비밀
2
MongoDB Atlas 서비스 계정당 활성 토큰
100

MongoDB Atlas는 다음 구성 요소 레이블에 대해 길이를 제한하고 ReGex 요구 사항을 적용합니다.

구성 요소
글자 수 제한
RegEx 패턴
클러스터 이름
64 [1]
^([a-zA-Z0-9]([a-zA-Z0-9-]){0,21}(?<!-)([\w]{0,42}))$ [2]
프로젝트 이름
64
^[\p{L}\p{N}\-_.(),:&@+']{1,64}$ [3]
조직 이름
64
^[\p{L}\p{N}\-_.(),:&@+']{1,64}$ [3]
API 키 설명
250
[1] 피어링 전용 모드를 활성화한 경우 클러스터 이름 글자 수 제한은 23입니다.
[2] MongoDB Atlas는 클러스터 이름의 처음 23자를 사용합니다. 이러한 문자는 클러스터 프로젝트 내에서 고유해야 합니다. 23자 미만인 클러스터 이름의 마지막 문자는 하이픈(-)이 될 수 없습니다. 23자를 초과하는 클러스터 이름의 23번째 문자는 하이픈이 될 수 없습니다.
[3](1, 2) 조직 및 프로젝트 이름에는 유니코드 문자 또는 숫자와 문장 부호(-_.(),:&@+')를 포함할 수 있습니다.

MongoDB Atlas 서버리스 인스턴스, 무료 클러스터 및 공유 클러스터에는 추가 한도가 적용됩니다. 자세히 알아보려면 다음 리소스를 참조하세요.

일부 MongoDB 명령은 MongoDB Atlas에서 지원되지 않습니다. 또한 일부 명령은 MongoDB Atlas 무료 클러스터에서만 지원됩니다. 자세히 알아보려면 다음 리소스를 참조하세요.

BSON 문서 크기

최대 BSON 문서 크기는 16메가바이트입니다.

최대 문서 크기는 단일 문서가 과도한 양의 RAM을 사용하거나, 전송 중에 과도한 대역폭을 사용하지 않도록 하는 데 도움이 됩니다. 최대 크기보다 큰 문서를 저장하기 위해 MongoDB는 GridFS API를 제공합니다. GridFS에 대한 자세한 내용은 mongofiles드라이버 설명서를 참조하십시오.

BSON 문서의 중첩 깊이

MongoDB는 BSON 문서에 대해 100개 이하의 중첩 수준을 지원합니다. 각 객체 또는 배열은 수준을 추가합니다.

데이터베이스 이름의 대/소문자 사용

데이터베이스를 구분하기 위해 대/소문자를 사용하지 않도록 합니다. 예를 들어 salesDataSalesData와 같은 이름의 두 데이터베이스를 사용할 수 없습니다.

MongoDB에서 데이터베이스를 만든 후에는 데이터베이스를 참조할 때 일관된 대/소문자를 사용해야 합니다. 예를 들어, salesData 데이터베이스를 만드는 경우 salesdata 또는 SalesData와 같이 대/소문자를 번갈아 사용하여 참조하지 않도록 합니다.

Windows용 데이터베이스 이름에 대한 제한 사항

Windows에서 실행되는 MongoDB deployment의 경우 데이터베이스 이름에 다음 문자를 포함할 수 없습니다.

/\. "$*<>:|?

또한 데이터베이스 이름에는 null 문자를 포함할 수 없습니다.

Unix 및 Linux 시스템의 데이터베이스 이름에 대한 제한 사항

Unix 및 Linux 시스템에서 실행되는 MongoDB deployment의 경우 데이터베이스 이름에 다음 문자를 포함할 수 없습니다.

/\. "$

또한 데이터베이스 이름에는 null 문자를 포함할 수 없습니다.

데이터베이스 이름 길이

데이터베이스 이름은 비워둘 수 없으며 64바이트 미만이어야 합니다.

컬렉션 이름 제한

컬렉션 이름은 밑줄 또는 문자로 시작해야 하며 다음은 불가능합니다.

  • $가 포함되어 있습니다.

  • 빈 문자열입니다(예: "").

  • null 문자를 포함합니다.

  • system. 접두사로 시작합니다 (내부용으로만 사용됨).

  • .system.이 포함되어 있습니다.

컬렉션 이름에 밑줄 문자와 같은 특수 문자가 포함되어 있거나 숫자로 시작하는 경우 컬렉션에 액세스하려면 mongoshdb.getCollection() 메서드 또는 드라이버의 유사한 메서드를 사용합니다.

네임스페이스 길이:

샤딩되지 않은 컬렉션 및 뷰에 대한 네임스페이스 길이 제한은 255바이트이고 샤딩된 컬렉션의 경우 235바이트입니다. 컬렉션 또는 뷰의 경우 네임스페이스에는 데이터베이스 이름, 점(.) 구분 기호 및 컬렉션/뷰 이름(예: <database>.<collection>)이 포함됩니다.

필드 이름에 대한 제한 사항
  • 필드 이름에는 null 문자를 포함 할 수 없습니다.

  • 서버는 점(.)과 달러 기호($)가 포함된 필드 이름의 저장을 허용합니다.

  • MongoDB 5.0은 필드 이름에 ($) 및 (.)를 사용에 대한 지원을 개선했습니다.몇 가지 제한 사항이 있습니다. 자세한 내용은 필드 이름 고려 사항을 참조하십시오.

  • 각 필드 이름은 문서 내에서 고유해야 합니다. 문서에 중복 필드가 있는 경우 MongoDB CRUD 작업이 예기치 않게 작동할 수 있으므로 중복 필드가 있는 문서를 저장해서는 안 됩니다.

_id에 대한 제한 사항

필드 이름 _id는 프라이머리 키로 사용하기 위해 예약되어 있으며, 이 값은 컬렉션에서 고유해야 하고 변경할 수 없으며 배열이나 정규 표현식 이외의 모든 유형이 될 수 있습니다. _id가 하위 필드를 포함하는 경우, 하위 필드 이름은 ($) 기호로 시작할 수 없습니다.

경고

이 섹션에서 설명하는 문제로 인해 데이터가 손실되거나 손상될 수 있으므로 주의하시기 바랍니다.

MongoDB 쿼리 언어는 필드 이름이 중복된 문서를 지원하지 않습니다. 일부 BSON 빌더는 필드 이름이 중복된 BSON 문서 생성을 지원할 수 있지만, 삽입이 성공했거나 성공한 것처럼 보이더라도 이러한 문서를 MongoDB에 삽입하는 것은 지원되지 않습니다. 예를 들어, 필드 이름이 중복된 BSON 문서를 MongoDB 드라이버를 통해 삽입하면 드라이버가 삽입 전에 중복 값을 조용히 삭제하거나 중복 필드가 포함된 유효하지 않은 문서가 삽입되는 결과를 초래할 수 있습니다. 이러한 문서에 대해 쿼리를 수행하면 임의적이고 일관성 없는 결과가 나올 수 있습니다.

MongoDB 5.0부터는 문서 필드 이름에 달러($) 접두사를 붙일 수 있으며 마침표(.)를 포함할 수 있습니다. 그러나 mongoimportmongoexport는 이러한 문자를 사용하는 필드 이름이 있는 일부 상황에서 예상대로 작동하지 않을 수 있습니다.

MongoDB 확장 JSON v2는 유형 래퍼와 유형 래퍼와 이름이 같은 필드를 구분할 수 없습니다. 해당 BSON 표현에 달러($) 접두사가 붙은 키가 포함될 수 있는 상황에서는 확장 JSON 형식을 사용하지 않도록 합니다. DBRef 메커니즘에는 해당 일반 규칙이 적용되지 않습니다.

필드 이름에 마침표(.)가 있는 mongoimportmongoexport를 사용하는 것에도 제한 사항이 있습니다. CSV 파일은 마침표(.)를 사용하여 데이터 계층 구조를 나타내므로 필드 이름에 마침표(.)가 있으면 중첩 수준으로 잘못 해석될 수 있습니다.

달러($) 접두사가 붙은 필드 이름 또는 마침표(.)가 포함된 필드 이름을 사용할 때 MongoDB 5.0 이전 서버에서 이러한 필드 이름이 승인되지 않은 쓰기(쓰기 고려 w=0)와 함께 사용되는 경우 데이터가 손실될 가능성이 적습니다.

insert, updatefindAndModify 명령을 실행할 때 5.0 호환 드라이버는 필드 이름 앞에 달러($)가 붙거나 마침표(.)가 포함된 문서 사용에 대한 제한을 제거합니다. 이러한 필드 이름은 이전 드라이버 버전에서 클라이언트 사이드 오류를 발생시켰습니다.

드라이버가 연결된 서버 버전에 관계없이 제한이 제거됩니다. 5.0 드라이버가 이전 서버로 문서를 보내는 경우 오류를 보내지 않고 문서가 거부됩니다.

네임스페이스 길이

샤딩되지 않은 컬렉션 및 뷰에 대한 네임스페이스 길이 제한은 255바이트이고 샤딩된 컬렉션의 경우 235바이트입니다. 컬렉션 또는 뷰의 경우 네임스페이스에는 데이터베이스 이름, 점(.) 구분 기호 및 컬렉션/뷰 이름(예: <database>.<collection>)이 포함됩니다.

다음도 참조하세요.

컬렉션당 인덱스 수

단일 컬렉션에는 64개 이하의 인덱스가 있을 수 있습니다.

복합 인덱스의 인덱싱된 필드 수

복합 인덱스에는 32개 이하의 필드가 포함될 수 있습니다.

쿼리는 텍스트 및 지리 공간적 인덱스를 모두 사용할 수 없습니다.

특수 텍스트 인덱스가 필요한 $text 쿼리를 다른 유형의 특수 인덱스가 필요한 쿼리 연산자와 결합할 수 없습니다. 예를 들어 $text 쿼리와 $near 연산자를 결합할 수 없습니다.

2dsphere 인덱스가 있는 필드는 도형만 보유할 수 있습니다.

2dsphere 인덱스가 있는 필드는 좌표 쌍 또는 GeoJSON 데이터 형식의 도형 데이터를 보유해야 합니다. 도형이 아닌 데이터가 있는 문서를 2dsphere 인덱스 필드에 삽입하거나 인덱스 필드에 도형이 아닌 데이터가 있는 컬렉션에 2dsphere 인덱스를 빌드하려고 하면 작업이 실패합니다.

다음도 참조하세요.

샤드 작업 제한의 고유 인덱스 한도입니다.

제한된 수의 2dsphere 인덱스 키

2dsphere 인덱스에 대한 키를 생성하기 위해 mongodGeoJSON 도형을 내부 표현에 매핑합니다. 결과적인 내부 표현은 큰 값 배열일 수 있습니다.

mongod가 배열을 포함하는 필드에 인덱스 키를 생성하면 mongod은 각 배열 요소에 대한 인덱스 키를 생성합니다. 복합 인덱스의 경우, mongod은 각 필드에 대해 생성된 키 세트의 데카르트 곱 을 계산합니다. 두 세트가 모두 큰 경우 데카르트 곱을 계산하면 작업이 메모리 제한을 초과할 수 있습니다.

indexMaxNumGeneratedKeysPerDocument는 메모리 부족 오류를 방지하기 위해 단일 문서에 대해 생성되는 최대 키 수를 제한합니다. 기본값은 문서당 100,000개의 인덱스 키입니다. 제한을 올릴 수는 있지만 indexMaxNumGeneratedKeysPerDocument 매개 변수가 지정한 것보다 더 많은 키가 필요한 경우 작업이 실패합니다.

WiredTiger 스토리지 엔진의 Covered Queries에서 반환된 NaN 값은 항상 double 형식입니다

인덱스에 포함되는 쿼리에서 반환된 필드 값이 NaN인 경우 해당 NaN 값의 유형은 항상 double입니다.

Multikey Index

멀티키 인덱스는 배열 필드에 대한 쿼리를 처리할 수 없습니다.

지리 공간적 인덱스

지리 공간적 인덱스는 쿼리를 처리할 수 없습니다.

인덱스 빌드의 메모리 사용량

createIndexes는 컬렉션에 하나 이상의 인덱스 빌드를 지원합니다. createIndexes는 메모리와 디스크의 임시 파일 조합을 사용하여 인덱스 빌드를 완료합니다. createIndexes의 메모리 사용량에 대한 기본 제한은 200MB이며 단일 createIndexes 명령을 사용하여 빌드된 모든 인덱스 간에 공유됩니다. 메모리 제한에 도달하면 createIndexes--dbpath 디렉토리 내의 _tmp 라는 하위 디렉토리에 있는 임시 디스크 파일을 사용하여 빌드를 완료합니다.

maxIndexBuildMemoryUsageMegabytes 서버 매개변수를 설정하여 메모리 제한을 덮어쓸 수 있습니다. 메모리 제한을 높게 설정하면 인덱스 빌드가 더 빨리 완료될 수 있습니다. 하지만 이 제한을 시스템의 미사용 RAM에 비해 너무 높게 설정하면 메모리가 고갈되고 서버가 종료될 수 있습니다.

인덱스 빌드는 createIndexes와 같은 사용자 명령이나 초기 동기화 같은 관리 프로세스에 의해 시작될 수 있습니다. 두 경우 모두 maxIndexBuildMemoryUsageMegabytes 기준 한도가 적용됩니다.

초기 동기화는 한 번에 하나의 컬렉션만 채우며 메모리 제한을 초과할 위험이 없습니다. 그러나 사용자가 여러 데이터베이스의 여러 컬렉션에 대한 인덱스 빌드를 동시에 시작하면 maxIndexBuildMemoryUsageMegabytes에서 설정한 제한보다 더 많은 양의 메모리를 사용할 수 있습니다.

인덱스 빌드가 복제본 세트와 복제본 세트 샤드가 포함된 샤딩된 클러스터에 미치는 영향을 최소화하려면 복제본 세트의 롤링 인덱스 빌드에 설명된 롤링 인덱스 빌드 절차를 사용합니다.

데이터 정렬 및 인덱스 유형

다음 인덱스 유형은 단순 이진 비교만 지원하며 데이터 정렬은 지원하지 않습니다:

단순 데이터 정렬이 아닌 컬렉션에 text 또는 2d 인덱스를 만들려면 인덱스를 만들 때 {collation: {locale: "simple"} }를 명시적으로 지정해야 합니다.

Hidden Indexes
최대 정렬 키 수
  • 최대 32개의 키를 기준으로 정렬할 수 있습니다.

  • 중복 필드가 포함된 정렬 패턴을 제공하면 오류가 발생합니다.

제한된 컬렉션의 최대 문서 수

createmax 매개 변수를 사용하여 제한 컬렉션의 최대 문서 수를 지정하는 경우 이 값은 문서 수 2 31개보다 작아야 합니다.

제한된 컬렉션을 생성할 때 최대 문서 수를 지정하지 않으면 문서 수에 제한이 없습니다.

복제본 세트의 멤버 수입니다.

복제본 세트에는 최대 50명의 구성원이 포함될 수 있습니다.

복제본 세트의 투표 구성원 수

복제본 세트에는 최대 7명의 투표 멤버가 있을 수 있습니다. 총 복제본 세트가 7명을 초과하는 멤버로 구성된 경우 투표권이 없는 멤버를 참조하세요.

자동 생성되는 Oplog의 최대 크기

oplog 크기를 명시적으로 지정하지 않으면(예: oplogSizeMB 또는 --oplogSize로) MongoDB는 50기가바이트 이하의 oplog를 생성합니다. [4]

[4] 2}가 삭제되는 것을 방지하기 위해 oplog가 구성된 크기 제한을 초과하여 커질 수 majority commit point 있습니다.

샤딩된 클러스터에는 여기에 설명된 제한 사항과 임계값이 있습니다.

샤드 환경에서 사용할 수 없는 작업

$where$where 함수에서 db 객체에 대한 참조를 허용하지 않습니다. 비 샤드형 컬렉션에서는 이런 일이 흔하지 않습니다.

geoSearch 명령은 샤딩된 환경에서는 지원되지 않습니다.

MongoDB 5.0 이전까지는 $lookup 단계의 from 파라미터에 샤드된 컬렉션을 지정할 수 없습니다.

샤딩된 클러스터에서 처리되는 쿼리

mongos에서 실행하는 경우 인덱스는 인덱스에 샤드 키가 포함된 경우에만 샤딩된 컬렉션에 대한 쿼리를 처리할 수 있습니다.

샤드된 컬렉션의 단일 문서 수정 작업

justOne 또는 multi: false 옵션을 지정하는 분할된 컬렉션에 대해 updateremove() 작업 사용 방법:

  • 하나의 샤드만 대상으로 하는 경우 쿼리 사양에서 부분 샤드 키를 사용할 수 있습니다.

  • 쿼리 사양에서 샤드 키 또는 _id 필드를 제공할 수 있습니다.

샤드된 컬렉션의 고유 인덱스

고유 인덱스에 전체 샤드 키가 인덱스의 접두사로 포함된 경우를 제외하고, MongoDB는 샤드 간 고유 인덱스를 지원하지 않습니다. 이러한 상황에서 MongoDB는 단일 필드가 아닌 전체 키에 고유성을 적용합니다.

참조:

마이그레이션할 범위당 최대 문서 수

기본적으로 MongoDB는 범위 내의 문서 수가 구성된 범위 크기를 평균 문서 크기로 나눈 결과의 2배보다 크면 범위를 이동할 수 없습니다. MongoDB가 청크의 하위 범위를 이동하여 크기를 그 이하로 줄일 수 있는 경우, 밸런서는 범위를 마이그레이션하는 방식으로 이를 수행합니다. db.collection.stats()에는 컬렉션의 avgObjSize 평균 문서 크기를 나타내는 필드가 포함되어 있습니다.

너무 커서 마이그레이션할 수 없는 청크의 경우:

  • 밸런서 설정 attemptToBalanceJumboChunks를 사용하면 청크에 점보 레이블이 지정되지 않은 한 밸런서가 이동하기에는 너무 큰 청크를 마이그레이션할 수 있습니다. 자세한 내용은 크기 제한을 초과하는 밸런스 범위를 참조하십시오.

    moveRangemoveChunk 명령을 발행할 때, forceJumbo 옵션을 지정하여 너무 커서 이동할 수 없는 범위의 마이그레이션을 허용할 수 있습니다. 범위는 점보로 표시되거나 표시되지 않을 수 있습니다.

샤드 키 인덱스 유형

샤드 키 인덱스는 샤드 키의 오름차순 인덱스, 샤드 키로 시작하여 샤드 키의 오름차순을 지정하는 복합 인덱스 또는 해시 인덱스가 될 수 있습니다.

샤드 키 인덱스는 다음과 같을 수 없습니다.

샤드 키 선택

샤드 키 변경 옵션은 실행 중인 MongoDB 버전에 따라 다릅니다.

단조롭게 증가하는 샤드 키로 인해 삽입 처리량이 제한될 수 있음

삽입량이 많은 클러스터의 경우 키가 단조롭게 증가하거나 감소하는 샤드 키가 삽입 처리량에 영향을 미칠 수 있습니다. 샤드 키가 _id 필드인 경우 _id 필드의 기본값은 일반적으로 값이 증가하는 ObjectID라는 점에 유의하세요.

샤드 키가 단조롭게 증가하는 문서를 삽입할 때, 모든 삽입은 단일 샤드의 동일한 청크에 속합니다. 결국 시스템은 모든 쓰기 작업을 수신하는 청크 범위를 나누고 데이터를 더 균등하게 분배하기 위해 콘텐츠를 마이그레이션합니다. 그러나 클러스터는 언제든지 단일 샤드에만 삽입 작업을 지시하므로 삽입 처리량 병목 현상이 발생합니다.

클러스터 작업이 주로 읽기 작업 및 업데이트인 경우 이 제한은 클러스터에 영향을 미치지 않을 수 있습니다.

이 제약을 피하려면 해시된 샤드 키를 사용하거나 단조롭게 증가하거나 감소하지 않는 필드를 선택하세요.

해시된 샤드 키해시된 인덱스는 키 해시를 오름차순으로 저장합니다.

정렬 작업

MongoDB가 인덱스 또는 인덱스를 사용하여 정렬을 순서대로 가져올 수 없는 경우, MongoDB는 데이터에 대해 차단 정렬 작업을 수행해야 합니다. 이름은 SORT 단계에서 출력 문서를 반환하기 전에 모든 입력 문서를 읽고 해당 쿼리에 대한 데이터 흐름을 차단해야 한다는 요구 사항을 나타냅니다.

MongoDB에서 차단 정렬 작업에 100메가바이트 이상의 시스템 메모리를 사용해야 하는 경우 쿼리에서 cursor.allowDiskUse()지정하지 않는 한 MongoDB는 오류를 반환합니다. allowDiskUse()는 MongoDB가 차단 정렬 작업을 처리하는 동안 디스크의 임시 파일을 사용하여 100메가바이트 시스템 메모리 제한을 초과하는 데이터를 저장하도록 허용합니다.

정렬 및 인덱스 사용에 대한 자세한 내용은 정렬 및 인덱스 사용을 참조하세요.

집계 파이프라인 단계

MongoDB 는 단일 파이프라인 에서 허용되는 집계 파이프라인 단계 수를 1000 으)로 제한합니다.

집계 파이프라인이 구문 분석 전후에 단계 제한을 초과하면 오류가 발생합니다.

집계 파이프라인 메모리

MongoDB 6.0부터 allowDiskUseByDefault 매개변수는 실행에 100메가바이트 이상의 메모리가 필요한 파이프라인 단계에서 기본적으로 디스크에 임시 파일 쓰기를 수행할지 여부를 제어합니다.

  • allowDiskUseByDefaulttrue로 설정하면 실행하는 데 100메가바이트 이상의 메모리가 필요한 파이프라인 단계에서는 기본적으로 임시 파일을 디스크에 씁니다. { allowDiskUse: false } 옵션을 사용하여 특정 find 또는 aggregate 명령에 대해 디스크에 임시 파일 쓰기를 비활성화할 수 있습니다.

  • allowDiskUseByDefaultfalse로 설정하면 실행하는 데 100메가바이트 이상의 메모리가 필요한 파이프라인 단계는 기본적으로 오류가 발생합니다. { allowDiskUse: true } 옵션을 사용하여 특정 find 또는 aggregate에 대한 임시 파일을 디스크에 쓸 수 있도록 설정할 수 있습니다.

$search 집계 단계는 별도의 프로세스에서 실행되므로 100 메가바이트의 RAM으로 제한되지 않습니다.

허용 디스크 사용true일 때 디스크에 임시 파일을 쓸 수 있는 단계의 예시는 다음과 같습니다.

참고

파이프라인 단계는 각 파이프라인 단계가 문서를 가져와 처리한 후 결과 문서를 출력하는 문서 스트림에서 작동합니다.

일부 단계에서는 들어오는 문서를 모두 처리할 때까지 문서를 출력할 수 없습니다. 이러한 파이프라인 단계는 들어오는 모든 문서가 처리될 때까지 단계 출력을 RAM에 보관해야 합니다. 따라서 이러한 파이프라인 단계에는 100MB 제한보다 더 많은 공간이 필요할 수 있습니다.

$sort 파이프라인 단계 중 하나의 결과가 한도를 초과하는 경우 $limit 단계를 추가하는 것을 고려하세요.

프로파일러 로그 메시지진단 로그 메시지에는 메모리 제한으로 인해 집계 단계에서 임시 파일에 데이터를 쓴 경우 usedDisk 표시기가 포함됩니다.

집계 및 읽기 관심사
2D 지리 공간적 쿼리에서는 $or 연산자를 사용할 수 없습니다.
지리공간 쿼리

구형 데이터에 대한 쿼리에 2d 인덱스를 사용하면 잘못된 결과 또는 오류가 반환될 수 있습니다. 예를 들어, 2d 인덱스는 극점을 감싸는 구형 쿼리를 지원하지 않습니다.

지리 공간적 좌표
  • 유효한 경도 값은 -180~180입니다(둘 모두 포함).

  • 유효한 위도 값은 -90~90입니다(둘 모두 포함).

GeoJSON 다각형의 면적

$geoIntersects 또는 $geoWithin의 경우 단일 반구보다 큰 면적을 가진 단일 고리 다각형을 지정하는 경우 $geometry 표현식에 사용자 지정 MongoDB 좌표 참조 시스템을 포함하세요. 그렇지 않으면 $geoIntersects 또는 $geoWithin은 보완 지오메트리를 쿼리합니다. 반구보다 큰 면적을 가진 다른 모든 GeoJSON 다각형의 경우, $geoIntersects 또는 $geoWithin으로 보완 도형을 쿼리합니다.

다중 문서 트랜잭션

다중 문서 트랜잭션의 경우:

  • 트랜잭션에서 컬렉션과 인덱스를 생성할 수 있습니다. 자세한 내용은 트랜잭션에서 컬렉션 및 인덱스 생성하기를 참조하세요

  • 트랜잭션에 사용되는 컬렉션은 서로 다른 데이터베이스에 있을 수 있습니다.

    참고

    샤드 간 쓰기 트랜잭션에서는 새 컬렉션을 생성할 수 없습니다. 예를 들어, 하나의 샤드에서 기존 컬렉션에 쓰고 다른 샤드에서 암시적으로 새 컬렉션을 생성하는 경우, MongoDB는 동일한 트랜잭션에서 두 작업을 모두 수행할 수 없습니다.

  • 제한된 컬렉션에는 쓸 (write) 수 없습니다.

  • 고정 사이즈 컬렉션에서 읽을 때는 읽기 고려 "snapshot"을 사용할 수 없습니다. (MongoDB 5.0부터 도입됨)

  • config, admin 또는 local 데이터베이스의 컬렉션을 읽고 쓸 수 없습니다.

  • system.* 컬렉션에 쓸 수 없습니다.

  • explain 또는 이와 유사한 명령을 사용하여 지원되는 작업의 쿼리 계획을 반환할 수 없습니다.

  • 트랜잭션 외부에서 생성된 커서의 경우 트랜잭션 내부에서 getMore을(를) 호출할 수 없습니다.

  • 트랜잭션에서 생성된 커서의 경우 트랜잭션 외부에서 getMore를 호출할 수 없습니다.

트랜잭션에서 허용되지 않는 작업은 다음과 같습니다.

거래에는 transactionLifetimeLimitSeconds에 명시된 바와 같이 평생 제한이 있습니다. 기본값은 60초입니다.

쓰기 명령 배치 제한 크기

100,000 서버에 대한 단일 요청으로 정의된 단일 배치 작업에서 쓰기가 허용됩니다.

mongoshBulk() 작업과 드라이버의 유사한 메서드에는 이러한 제한이 없습니다.

조회수

보기 정의 pipeline에는 $out 또는 $merge 단계를 포함할 수 없습니다. 이 제한은 $lookup 단계 또는 $facet 단계에서 사용되는 파이프라인과 같은 임베디드 파이프라인에도 적용됩니다.

보기에는 다음과 같은 작업 제한이 있습니다.

프로젝션 제한 사항
$-접두사 필드 경로 제한
find()findAndModify() 프로젝션은 DBRef 필드를 제외하고 $(으)로 시작하는 필드를 프로젝션할 수 없습니다. 예를 들어 다음 작업은 유효하지 않습니다.
db.inventory.find( {}, { "$instock.warehouse": 0, "$item": 0, "detail.$price": 1 } )
$ 위치 연산자 배치 제한
$ 프로젝션 연산자는 필드 경로 끝에만 나타날 수 있습니다(예: "field.$" 또는 "fieldA.fieldB.$"). 예를 들어 다음 작업은 유효하지 않습니다.
db.inventory.find( { }, { "instock.$.qty": 1 } )
이 문제를 해결하려면 $ 투영 연산자 뒤에 오는 필드 경로의 구성요소를 제거합니다.
빈 필드 이름 프로젝션 제한
find()findAndModify() 프로젝션에는 빈 필드 이름의 프로젝션이 포함될 수 없습니다. 예를 들어 다음 작업은 유효하지 않습니다.
db.inventory.find( { }, { "": 0 } )
이전 버전에서 MongoDB는 빈 필드의 포함/제외를 존재하지 않는 필드의 프로젝션과 동일하게 처리합니다.
경로 충돌: 내장된 문서 및 해당 필드
내장된 문서의 어떤 필드로도 내장된 문서를 프로젝션할 수 없습니다. 예를 들어, size 필드가 내장된 문서가 있는 컬렉션 inventory를 생각해 보세요.
{ ..., size: { h: 10, w: 15.25, uom: "cm" }, ... }
다음 작업은 size 문서와 size.uom 필드를 모두 프로젝트하려고 하기 때문에 실패하며 Path collision 오류를 반환합니다.
db.inventory.find( {}, { size: 1, "size.uom": 1 } )
이전 버전에서는 내장된 문서와 해당 필드 사이의 마지막 프로젝션이 프로젝션을 결정합니다.
  • 내장된 문서의 프로젝션이 해당 필드의 모든 프로젝션 다음에 오는 경우 MongoDB는 내장된 문서를 프로젝트합니다. 예를 들어 프로젝션 문서 { "size.uom": 1, size: 1 }은 프로젝션 문서 { size: 1 }과 동일한 결과를 생성합니다.

  • 내장된 문서의 프로젝션이 해당 필드의 프로젝션보다 먼저 오면 MongoDB는 지정된 필드를 프로젝트합니다. 예를 들어 프로젝션 문서 { "size.uom": 1, size: 1, "size.h": 1 }은 프로젝션 문서 { "size.uom": 1, "size.h": 1 }과 동일한 결과를 생성합니다.

경로 충돌: 배열 및 포함된 필드의 $slice 충돌
find()findAndModify() 프로젝션은 배열의 $slice 및 배열에 포함된 필드를 모두 포함할 수 없습니다. 예를 들어 배열 필드 instock을 포함하는 컬렉션 inventory를 생각해 보겠습니다.
{ ..., instock: [ { warehouse: "A", qty: 35 }, { warehouse: "B", qty: 15 }, { warehouse: "C", qty: 35 } ], ... }
Path collision 오류와 함께 다음 작업이 실패합니다.
db.inventory.find( {}, { "instock": { $slice: 1 }, "instock.warehouse": 0 } )
이전 버전에서 프로젝션은 두 프로젝션을 모두 적용하고 instock 배열의 첫 번째 요소($slice: 1)를 반환하지만 프로젝션된 요소에서 warehouse 필드를 억제합니다. MongoDB 4.4부터는 동일한 결과를 얻으려면 $project 로 구성된 db.collection.aggregate() 메서드를 사용하십시오.
$ 위치 연산자 및 $slice 제한
find()findAndModify() 프로젝션은 $ 프로젝션 표현식의 일부로 $slice 프로젝션 표현식을 포함할 수 없습니다. 예를 들어 다음 연산은 유효하지 않습니다.
db.inventory.find( { "instock.qty": { $gt: 25 } }, { "instock.$": { $slice: 1 } } )
이전 버전에서 MongoDB는 쿼리 조건과 일치하는 instock 배열의 첫 번째 요소 (instock.$)를 반환합니다. 즉, 위치 프로젝션 "instock.$" 이(가) 우선하고 $slice:1 은(는) 작동하지 않습니다. "instock.$": { $slice: 1 } 은(는) 다른 문서 필드를 제외하지 않습니다.
세션 및 $external 사용자 이름 제한

2} 인증 사용자(Kerberos, LDAP 또는 x.509 사용자)와 함께 클라이언트 세션 및 인과적 일관성 보장을 사용하려면 사용자 이름이 10KB보다 클 수 없습니다. $external

세션 유휴 시간 초과

30분 동안 읽기 또는 쓰기 작업이 없거나 이 임계값 내에서 refreshSessions를 사용하여 새로 고쳐지지 않는 세션은 만료된 것으로 표시되며 언제든지 MongoDB 서버에서 닫을 수 있습니다. 세션을 닫으면 진행 중인 모든 작업이 종료되고 세션과 연결된 커서가 열립니다. 여기에는 noCursorTimeout() 또는 30분보다 큰 maxTimeMS()로 구성된 커서가 포함됩니다.

db.collection.find()를 발행하는 애플리케이션을 고려하십시오. 서버는 find()cursor.batchSize()로 정의된 문서 일괄 처리와 함께 커서를 반환합니다. 애플리케이션이 서버에서 새로운 문서 배치를 요청할 때마다 세션이 새로 고쳐집니다. 그러나 애플리케이션이 현재 문서 배치를 처리하는 데 30분 이상 소요되면 세션이 만료되고 닫힌 것으로 표시됩니다. 애플리케이션이 다음 문서 배치를 요청하면 세션이 닫힐 때 커서가 종료되므로 서버는 오류를 반환합니다.

커서를 반환하는 작업의 경우 커서가 30분 이상 유휴 상태일 수 있는 경우 Mongo.startSession()를 사용하여 명시적 세션 내에서 작업을 실행하고 refreshSessions 명령을 사용하여 세션을 주기적으로 새로 고칩니다. 예시:

var session = db.getMongo().startSession()
var sessionId = session
sessionId // show the sessionId
var cursor = session.getDatabase("examples").getCollection("data").find().noCursorTimeout()
var refreshTimestamp = new Date() // take note of time at operation start
while (cursor.hasNext()) {
// Check if more than 5 minutes have passed since the last refresh
if ( (new Date()-refreshTimestamp)/1000 > 300 ) {
print("refreshing session")
db.adminCommand({"refreshSessions" : [sessionId]})
refreshTimestamp = new Date()
}
// process cursor normally
}

예시 작업에서 db.collection.find() 메서드는 명시적 세션과 연결됩니다. 커서는 유휴 상태일 때 서버가 커서를 닫는 것을 방지하기 위해 noCursorTimeout()으로 구성됩니다. while 루프에는 refreshSessions를 사용하여 5분마다 세션을 새로 고치는 블록이 포함되어 있습니다. 세션은 30분의 유휴 시간 제한을 초과하지 않으므로 커서는 무기한 열린 상태로 유지될 수 있습니다.

MongoDB 드라이버의 경우, 세션 생성에 대한 지침과 구문은 드라이버 설명서를 참조하세요.

돌아가기

로그 메시지