db.collection.createIndexes()
이 페이지의 내용
드라이버가 포함된 MongoDB
이 페이지에서는 mongosh
메서드를 설명합니다. MongoDB 드라이버에서 해당 메서드를 보려면 프로그래밍 언어의 해당 페이지를 참조하세요.
정의
db.collection.createIndexes( [ keyPatterns ], options, commitQuorum )
컬렉션에 하나 이상의 인덱스를 만듭니다.
인덱스 빌드가 복제본 세트와 샤딩된 클러스터에 미치는 영향을 최소화하려면 복제본 세트에 대한 롤링 인덱스 빌드에 설명된 롤링 인덱스 빌드 절차를 사용하세요.
db.collection.createIndexes()
다음 매개변수를 사용합니다.Parameter유형설명keyPatterns
문서
인덱스 사양 문서가 포함된 배열입니다. 각 문서에는 필드와 값 쌍이 포함되어 있습니다. 여기서 필드는 인덱스 키이고 값은 해당 필드의 인덱스 유형을 설명합니다. 필드의 오름차순 인덱스의 경우
1
값을 지정하고, 내림차순 인덱스의 경우-1
값을 지정합니다.MongoDB는 다음과 같은 여러 가지 인덱스 유형을 지원합니다.
자세한 내용은 인덱스 유형을 참조하세요.
와일드카드 인덱스는 사용자가 사용자 지정 필드 또는 컬렉션의 다양한 필드에 대해 쿼리하는 워크로드를 지원합니다.
특정 필드와 해당 하위 경로 또는 문서의 모든 필드에 와일드카드 인덱스를 생성할 수 있습니다.
자세한 내용은 복합 와일드카드 인덱스를 참조하세요.
options
문서
선택 사항. 인덱스 생성을 제어하는 설정하다 의 옵션이 포함된 문서 입니다. 자세한 내용은 옵션을 참조하세요.
정수 또는 문자열
선택 사항입니다. 프라이머리 등 데이터를 포함하는 투표 복제본 세트 멤버의 최소 수(즉, 쿼럼 커밋)이며, 이는 프라이머리가
indexes
을(를) 준비됨으로 표시하기 전에 성공적인 인덱스 빌드를 보고해야 합니다. '투표' 멤버는members[n].votes
이(가)0
보다 큰 모든 복제본 세트 멤버입니다.는 다음과 같은 값을 지원합니다.
"votingMembers"
- 모든 데이터를 보유하는 투표 복제본 세트 멤버(기본값)입니다."majority"
- 데이터 보유 투표 복제본 세트 멤버의 단순 과반수입니다.<int>
- 특정 수의 데이터를 보유하는 투표 복제본 세트 멤버입니다.0
- 쿼럼 투표 동작을 사용하지 않도록 설정합니다. 멤버는 인덱스 작성을 동시에 시작하지만 인덱스 작성을 완료하기 전에 투표하거나 쿼럼을 기다리지 않습니다. 쿼럼 커밋이0
인 인덱스 빌드를 시작하는 경우 나중에setIndexCommitQuorum
를 사용하여 쿼럼 커밋을 수정할 수 없습니다.복제본 세트 태그 이름.
호환성
이 메서드는 다음 환경에서 호스팅되는 배포에서 사용할 수 있습니다.
MongoDB Atlas: 클라우드에서의 MongoDB 배포를 위한 완전 관리형 서비스
참고
이 명령은 모든 MongoDB Atlas 클러스터에서 지원됩니다. 모든 명령에 대한 Atlas 지원에 관해 자세히 알아보려면 지원되지 않는 명령을 참조하십시오.
MongoDB Enterprise: MongoDB의 구독 기반 자체 관리 버전
MongoDB Community: MongoDB의 소스 사용 가능 무료 자체 관리 버전
Stable API
Stable API V1을 사용하는 경우:
options
문서에는 다음 필드 중 어느 것도 지정할 수 없습니다.background
bucketSize
sparse
storageEngine
geoHaystack 또는 텍스트 인덱스는 생성할 수 없습니다.
위의 지원되지 않는 인덱스 유형은 엄격 모드 에서 쿼리 플래너 에 의해 무시됩니다. 예를 예시
sparse
인덱스 를cursor.hint()
와 함께 사용하려고 하면 다음과 같은BadValue
오류가 발생합니다.planner returned error :: caused by :: hint provided does not correspond to an existing index
옵션
options
문서에는 인덱스 생성을 제어하는 옵션 집합이 포함되어 있습니다. 인덱스 유형에 따라 해당 유형에 맞는 추가 옵션이 있을 수 있습니다.
동일한 문서에 여러 인덱스 옵션을 지정할 수 있습니다. 그러나 여러 옵션 문서를 지정하면 db.collection.createIndexes()
작업이 실패합니다.
다음과 같은 db.collection.createIndexes()
연산을 고려해 보세요.
db.collection.createIndexes( [ { "a": 1 }, { "b": 1 } ], { unique: true, sparse: true, expireAfterSeconds: 3600 } )
옵션 사양이 여러 문서로 분할된 경우(예: { unique: true }, { sparse: true, expireAfterSeconds: 3600 }
) 인덱스 생성 작업은 실패하게 됩니다.
중요
옵션을 db.collection.createIndexes()
로 지정하면 지정된 모든 인덱스에 옵션이 적용됩니다. 예를 들어 데이터 정렬 옵션을 지정하면 생성된 모든 인덱스에 해당 데이터 정렬이 포함됩니다.
db.collection.createIndexes()
은(는) 호환되지 않는 옵션이나 인수가 너무 많은 인덱스를 만들려고 하면 오류가 반환됩니다. 자세한 내용은 옵션 설명을 참조하세요.
모든 인덱스 유형에 대한 옵션
다음 옵션은 달리 지정되지 않는 한 모든 인덱스 유형에 사용할 수 있습니다.
Parameter | 유형 | 설명 | |
---|---|---|---|
| 부울 | ||
| 문자열 | 선택 사항. 인덱스의 이름입니다. 지정되지 않은 경우 MongoDB는 인덱싱된 필드의 이름과 정렬 순서를 연결하여 인덱스 이름을 생성합니다. 에 지정된 옵션은 키 패턴 배열 에 포함된 모든 인덱스 | |
| 문서 | ||
| 부울 | 선택 사항. 다음 인덱스 유형은 기본적으로 희박하며 이 옵션을 무시합니다.
부분 인덱스는 sparse index 기능의 상위 집합입니다. 애플리케이션에 특정 요구 사항이 없는 경우 sparse index 대신 부분 인덱스를 사용하세요. | |
| integer | 선택 사항. MongoDB가 이 컬렉션에 문서를 보관하는 기간을 제어하기 위해 TTL(Time To Live)로 초 단위의 값을 지정합니다. 이 옵션은 TTL 인덱스에만 적용됩니다. 자세한 내용은 TTL을 설정하여 컬렉션에서 데이터 만료하기를 참조하세요. MongoDB 5.0 이전에 생성된 TTL 인덱스를 사용하거나 MongDB 5.0에서 생성된 데이터를 5.0 이전 설치와 동기화하려는 경우 잘못된 구성 문제를 방지하려면 NaN을 사용하여 구성된 인덱스를 참조하세요. TTL 인덱스 | |
부울 | 선택 사항입니다. 쿼리 플래너에서 인덱스를 숨길지 여부를 결정하는 플래그입니다. 숨겨진 인덱스는 쿼리 계획 선택의 일부로 평가되지 않습니다. 기본값은 | ||
| 문서 | 선택 사항. 사용자가 생성된 인덱스에 대한 스토리지 엔진을 구성할 수 있습니다.
인덱스를 만들 때 지정한 스토리지 엔진 구성 옵션은 다른 스토리지 엔진을 사용하는 멤버가 있는 복제본 세트를 지원하기 위해 복제 중에 유효성이 검사되고 oplog에 기록됩니다. |
데이터 정렬 옵션
Parameter | 유형 | 설명 | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
| 문서 | 선택 사항입니다. 인덱스의 데이터 정렬을 지정합니다. 데이터 정렬을 사용하면 대소문자 및 악센트 표시 규칙과 같은 문자열 비교에 대한 언어별 규칙을 지정할 수 있습니다. collection 수준에서 데이터 정렬을 지정한 경우:
데이터 정렬 옵션의 구문은 다음과 같습니다:
데이터 정렬을 지정할 때 |
다음 인덱스는 단순 바이너리 비교만 지원하며 데이터 정렬은 지원하지 않습니다.
팁
단순 데이터 정렬이 아닌 컬렉션에 text
또는 2d
인덱스를 만들려면 인덱스를 만들 때 {collation:
{locale: "simple"} }
를 명시적으로 지정해야 합니다.
데이터 정렬 및 인덱스 사용
collection 수준에서 데이터 정렬을 지정한 경우:
인덱스를 생성할 때 데이터 정렬을 지정하지 않으면 MongoDB는 collection의 기본 데이터 정렬을 사용하여 인덱스를 생성합니다.
인덱스를 생성할 때 데이터 정렬을 지정하면 MongoDB는 지정된 데이터 정렬로 인덱스를 생성합니다.
팁
1
또는 2
의 데이터 정렬 strength
를 지정하면 대소문자를 구분하지 않는 인덱스를 생성할 수 있습니다. 1
의 데이터 정렬 strength
를 사용하는 인덱스는 발음 구별 부호와 대소문자를 구분하지 않습니다.
동일한 키에 서로 다른 데이터 정렬을 사용하여 여러 인덱스를 생성할 수 있습니다. 키 패턴은 같지만 데이터 정렬이 다른 고유한 인덱스를 만들려면 고유한 인덱스 이름을 입력해야 합니다.
문자열 비교에 인덱스를 사용하려면 작업에서 동일한 데이터 정렬도 지정해야 합니다. 즉, 작업에서 다른 데이터 정렬을 지정하는 경우 데이터 정렬이 있는 인덱스는 인덱싱된 필드에서 문자열 비교를 수행하는 작업을 지원할 수 없습니다.
경고
데이터 정렬로 구성된 인덱스는 ICU 데이터 정렬 키를 사용하여 정렬 순서를 지정하므로, 데이터 정렬이 없는 인덱스의 경우 데이터 정렬 인식 인덱스 키가 인덱스 키보다 클 수 있습니다.
예를 들어, 컬렉션 myColl
에는 대조 국가 및 언어 설정이 "fr"
인 문자열 필드 category
에 대한 색인이 있습니다.
db.myColl.createIndex( { category: 1 }, { collation: { locale: "fr" } } )
인덱스와 동일한 데이터 정렬을 지정하는 다음 쿼리 작업에서는 인덱스를 사용할 수 있습니다.
db.myColl.find( { category: "cafe" } ).collation( { locale: "fr" } )
하지만 기본적으로 '단순' 바이너리 데이터 정렬기를 사용하는 다음 쿼리 작업에서는 인덱스를 사용할 수 없습니다.
db.myColl.find( { category: "cafe" } )
인덱스 접두사 키가 문자열, 배열 및 내장된 문서가 아닌 복합 인덱스의 경우, 다른 데이터 정렬을 지정하는 작업에서도 인덱스를 사용하여 인덱스 접두사 키에 대한 비교를 지원할 수 있습니다.
예를 들어, 컬렉션 myColl
에는 숫자 필드 score
및 price
와 문자열 필드 category
에 복합 인덱스가 있습니다. 인덱스는 문자열 비교를 위해 데이터 정렬 국가 및 언어 설정 "fr"
을 사용하여 만들어집니다.
db.myColl.createIndex( { score: 1, price: 1, category: 1 }, { collation: { locale: "fr" } } )
문자열 비교에 "simple"
이진 데이터 정렬을 사용하는 다음 작업에서는 인덱스를 사용할 수 있습니다.
db.myColl.find( { score: 5 } ).sort( { price: 1 } ) db.myColl.find( { score: 5, price: { $gt: NumberDecimal( "10" ) } } ).sort( { price: 1 } )
색인이 생성된 category
필드의 문자열 비교를 위해 "simple"
이진 데이터 정렬을 사용하는 다음 작업은 색인을 사용하여 쿼리의 score: 5
부분만 수행할 수 있습니다.
db.myColl.find( { score: 5, category: "cafe" } )
중요
내장된 문서 키를 비롯한 문서 키와의 일치는 단순 이진 비교를 사용합니다. 즉, "foo.bár"와 같은 키에 대한 쿼리는 "foo.bar" 키와 일치하지 않습니다. 이는 강도 매개변수에 설정한 값에 관계없이 적용됩니다.
인덱스에 대한 text
옵션
다음 옵션은 텍스트 인덱스에만 사용할 수 있습니다.
Parameter | 유형 | 설명 |
---|---|---|
| 문서 | 선택 사항. 텍스트 인덱스의 경우 필드 및 가중치 쌍을 포함하는 문서입니다. 가중치는 1~99,999 범위의 정수이며, 인덱싱된 다른 필드에 대한 해당 필드의 중요도를 점수 측면에서 나타냅니다. 인덱싱된 일부 필드 또는 모든 필드에 가중치를 지정할 수 있습니다. 점수를 조정하려면 자체 관리형 배포에서 텍스트 검색 결과에 가중치 할당하기를 참조하세요. 기본값은 MongoDB 5.0부터 가중치 옵션은 텍스트 인덱스에만 허용됩니다. |
| 문자열 | 선택 사항. 텍스트 인덱스의 경우 이 언어는 중지 단어 목록과 어간 및 토크나이저에 대한 규칙을 결정합니다. 자세한 내용과 예시는 사용 가능한 언어에 대한 자체 관리형 배포의 텍스트 검색 언어 및 자체 관리형 배포의 텍스트 인덱스에 대한 기본 언어 지정을 참조하세요. 기본값은 |
| 문자열 | 선택 사항입니다. 텍스트 인덱스에서 컬렉션 문서의 필드 이름으로, 문서의 재정의 언어를 포함합니다. 기본값은 |
| integer | 선택 사항. 사용 가능한 버전은 자체 관리형 배포에 대한 텍스트 인덱스 버전을 참조하세요. |
인덱스에 대한 2dsphere
옵션
다음 옵션은 2Ddsphere 인덱스에만 사용할 수 있습니다.
Parameter | 유형 | 설명 |
---|---|---|
| integer | 선택 사항. 사용 가능한 버전은 2dsphere 인덱스를 참고하세요. |
인덱스에 대한 2d
옵션
다음 옵션은 2d
인덱스에만 사용할 수 있습니다.
Parameter | 유형 | 설명 |
---|---|---|
| integer | 선택 사항입니다.
|
| 숫자 | 선택 사항. |
| 숫자 | 선택 사항. |
인덱스에 대한 wildcard
옵션
다음 옵션은 와일드카드 인덱스에만 사용할 수 있습니다.
Parameter | 유형 | 설명 | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 문서 | 선택 사항입니다. 사용자가 와일드카드 인덱스에서 특정 필드 경로를 포함하거나 제외할 수 있습니다. 이 옵션은 모든 문서 필드에 와일드카드 인덱스를 생성하는 경우에만 유효합니다. 특정 필드 경로 및 해당 하위 필드에 와일드카드 인덱스를 생성하는 경우에는
그러나 와일드카드 필드와 일반(와일드카드가 아닌) 필드에 동일한 필드를 포함하는 인덱스는 정의할 수 없습니다. 인덱스를 올바르게 정의하려면
와일드카드 인덱스는 기본적으로
|
동작
기존 인덱스 다시 만들기
이미 존재하는 인덱스에 대해 db.collection.createIndexes()
를 호출하면 MongoDB는 기존 인덱스를 다시 생성하지 않습니다.
인덱스 옵션
데이터 비정렬 및 비숨김 옵션
데이터 정렬 옵션을 제외하고, 한 세트의 인덱스 옵션으로 인덱스를 생성한 다음 다른 인덱스 옵션으로 동일한 인덱스를 다시 생성하려고 하면 MongoDB는 옵션을 변경하거나 인덱스를 다시 생성하지 않습니다.
인덱스를 제거하고 다시 생성하지 않고도 숨김 옵션을 변경할 수 있습니다. 자세한 내용은 숨김 옵션을 참조하세요.
다른 인덱스 옵션을 변경하려면 기존 인덱스를 db.collection.dropIndex()
로 제거한 후 새 옵션으로 db.collection.createIndexes()
를 실행하세요.
데이터 정렬 옵션
동일한 키에 서로 다른 데이터 정렬을 사용하여 여러 인덱스를 생성할 수 있습니다. 키 패턴은 같지만 데이터 정렬이 다른 고유한 인덱스를 만들려면 고유한 인덱스 이름을 입력해야 합니다.
숨겨진 옵션
기존 인덱스를 숨기거나 숨김 해제하려면 다음 mongosh
메서드를 사용할 수 있습니다:
예를 들면 다음과 같습니다.
인덱스의
hidden
옵션을true
(으)로 변경하려면db.collection.hideIndex()
메서드를 사용하며 다음과 같습니다.db.restaurants.hideIndex( { borough: 1, ratings: 1 } ); 인덱스의
hidden
옵션을false
(으)로 변경하려면db.collection.unhideIndex()
메서드를 사용하며 다음과 같습니다.db.restaurants.unhideIndex( { borough: 1, city: 1 } );
와일드카드 인덱스
와일드카드 인덱스는 기본적으로
_id
필드를 생략합니다. 와일드카드 인덱스에_id
필드를 포함하려면 해당 필드를wildcardProjection
문서에 명시적으로 포함해야 합니다.{ "wildcardProjection" : { "_id" : 1, "<field>" : 0|1 } } wildcardProjection
문서의 모든 명령문은 포함문 또는 제외문이어야 합니다. 제외문과 함께_id
필드를 포함할 수도 있습니다. 이는 규칙의 유일한 예외입니다.와일드카드 인덱스는 다음 사항을 지원하지 않습니다.
와일드카드 인덱스는 희소 인덱스입니다. 인덱싱된 필드가 존재하지 않는 경우 쿼리를 지원하지 않습니다. 와일드카드 인덱스는 와일드카드 필드에
null
값이 있는 경우 문서를 인덱싱합니다.MongoDB 7.0부터 와일드카드 인덱스는 오름차순(
1
) 및 내림차순(-1
) 정렬 순서를 모두 지원합니다. 이전 버전에서는 오름차순만 지원했습니다.
자세한 내용은 다음을 참조하세요.
트랜잭션
트랜잭션이 교차 샤드 쓰기 트랜잭션(write transaction)인 이 아닌 경우 분산 트랜잭션 내에서 컬렉션과 인덱스를 생성할 수 있습니다.
트랜잭션에서 db.collection.createIndexes()
를 사용하려면 트랜잭션에서 읽기 고려 "local"
를 사용해야 합니다. "local"
이외의 읽기 고려 수준을 지정하면 트랜잭션이 실패합니다.
인덱스 빌드
버전 7.1의 변경사항입니다.
MongoDB 7.1부터 오류 보고 속도가 빨라지고 회복 탄력성이 향상되어 인덱스 빌드가 개선되었습니다. 디스크 공간이 너무 부족하면 인덱스 빌드를 중지하는 새로운 indexBuildMinAvailableDiskSpaceMB
매개 변수를 사용하여 인덱스 빌드에 필요한 최소 사용 가능한 디스크 공간을 설정할 수도 있습니다.
다음 표에서는 MongoDB 7.1부터 인덱스 빌드 동작을 이전 버전과 비교합니다.
MongoDB 7.1부터 시작되는 동작 | 이전 MongoDB 버전의 동작 |
---|---|
중복 키 오류를 제외하고 컬렉션 스캔 단계에서 발견된 인덱스 오류는 즉시 반환된 후 인덱스 빌드가 중지됩니다. 이전 MongoDB 버전은 인덱스 빌드가 거의 끝날 무렵에 발생하는 커밋 단계에서 오류를 반환합니다. MongoDB 7.1을 사용하면 인덱스 오류를 신속하게 진단할 수 있습니다. 예를 들어 호환되지 않는 인덱스 값 형식이 발견되면 오류가 즉시 반환됩니다. | 인덱스 빌드 오류는 커밋 단계에서 인덱스 빌드가 끝날 무렵에 오류가 반환되기 때문에 MongoDB 7.1에 비해 반환하는 데 시간이 오래 걸릴 수 있습니다. |
인덱스 빌드 오류로 인해 세컨더리 멤버가 충돌할 수 있습니다. | |
인덱스 빌드를 위한 디스크 공간 관리가 개선되었습니다. 사용 가능한 디스크 공간이 | 사용 가능한 디스크 공간이 부족한 경우 인덱스 빌드가 중지되지 않습니다. |
예시
옵션 없이 인덱스 생성
다음과 유사한 문서가 포함된 restaurants
collection이 있다고 가정해 보겠습니다.
{ location: { type: "Point", coordinates: [-73.856077, 40.848447] }, name: "Morris Park Bake Shop", cuisine: "Cafe", borough: "Bronx", }
다음 예시에서는 restaurants
컬렉션에 두 개의 인덱스, 즉 borough
필드에 오름차순 인덱스와 location
필드에 2dsphere 인덱스를 생성합니다.
db.restaurants.createIndexes([{"borough": 1}, {"location": "2dsphere"}])
데이터 정렬을 지정하여 인덱스 생성하기
다음 예시에서는 products
collection에 두 개의 인덱스, 즉 manufacturer
필드 기준의 오름차순 인덱스와 category
필드 기준의 오름차순 인덱스를 생성합니다. 두 인덱스 모두 국가 및 언어 설정 fr
및 비교 강도 2
를 지정하는 데이터 정렬을 사용합니다.
db.products.createIndexes( [ { "manufacturer": 1}, { "category": 1 } ], { collation: { locale: "fr", strength: 2 } })
동일한 데이터 정렬 규칙을 사용하는 인덱싱된 키에 대한 쿼리 또는 정렬 작업의 경우 MongoDB는 인덱스를 사용할 수 있습니다. 자세한 내용은 데이터 정렬 및 인덱스 사용을 참조하세요.
와일드카드 인덱스 만들기
와일드카드 인덱스에 대한 전체 문서는 와일드카드 인덱스를 참조하세요.
다음은 와일드카드 인덱스 생성의 예입니다.
단일 필드 경로에 와일드카드 인덱스 생성
products_catalog
문서에 product_attributes
필드가 포함될 수 있는 컬렉션을 가정해 보겠습니다. product_attributes
필드에는 내장된 문서 및 배열을 포함하여 임의의 중첩 필드가 포함될 수 있습니다.
db.products_catalog.insertMany( [ { _id : ObjectId("5c1d358bf383fbee028aea0b"), product_name: "Blaster Gauntlet", product_attributes: { price: { cost: 299.99, currency: "USD" } } }, { _id: ObjectId("5c1d358bf383fbee028aea0c"), product_name: "Super Suit", product_attributes: { superFlight: true, resistance: [ "Bludgeoning", "Piercing", "Slashing" ] } } ] )
다음 작업은 product_attributes
필드에 와일드카드 인덱스를 생성합니다.
use inventory db.products_catalog.createIndexes( [ { "product_attributes.$**" : 1 } ] )
이 와일드카드 인덱스를 사용하면 MongoDB는 product_attributes
의 모든 스칼라 값을 인덱싱합니다. 필드가 중첩된 문서 또는 배열인 경우 와일드카드 인덱스는 문서/배열로 되풀이되어 문서/배열의 모든 스칼라 필드를 인덱싱합니다.
와일드카드 인덱스는 product_attributes
또는 중첩된 필드 중 하나에 대한 임의의 단일 필드 쿼리를 지원할 수 있습니다.
db.products_catalog.find( { "product_attributes.superFlight" : true } ) db.products_catalog.find( { "product_attributes.maxSpeed" : { $gt : 20 } } ) db.products_catalog.find( { "product_attributes.elements" : { $eq: "water" } } )
참고
경로별 와일드카드 인덱스 구문은 wildcardProjection
옵션과 호환되지 않습니다. 자세한 내용은 매개변수 문서를 참조하세요.
모든 필드 경로에 와일드카드 인덱스 생성
products_catalog
문서에 product_attributes
필드가 포함될 수 있는 컬렉션을 가정해 보겠습니다. product_attributes
필드에는 내장된 문서 및 배열을 포함하여 임의의 중첩 필드가 포함될 수 있습니다.
db.products_catalog.insertMany( [ { _id : ObjectId("5c1d358bf383fbee028aea0b"), product_name: "Blaster Gauntlet", product_attributes: { price: { cost: 299.99, currency: "USD" } } }, { _id: ObjectId("5c1d358bf383fbee028aea0c"), product_name: "Super Suit", product_attributes: { superFlight: true, resistance: [ "Bludgeoning", "Piercing", "Slashing" ] } } ] )
다음 작업은 모든 스칼라 필드(_id
필드 제외)에 와일드카드 인덱스을 생성합니다.
use inventory db.products_catalog.createIndexes( [ { "$**" : 1 } ] )
MongoDB는 이 와일드카드 인덱스를 사용하여 collection의 각 문서에 대한 모든 스칼라 필드를 인덱싱합니다. 지정된 필드가 중첩된 문서 또는 배열인 경우 와일드카드 인덱스는 문서/배열에 대해 재귀적으로 작업을 수행하여 문서/배열의 모든 스칼라 필드를 인덱싱합니다.
생성된 인덱스는 collection에 있는 문서 내의 임의 필드에 대한 쿼리를 지원할 수 있습니다.
db.products_catalog.find( { "product_price" : { $lt : 25 } } ) db.products_catalog.find( { "product_attributes.elements" : { $eq: "water" } } )
참고
와일드카드 인덱스는 기본적으로 _id
필드를 생략합니다. 와일드카드 인덱스에 _id
필드를 포함하려면 해당 필드를 wildcardProjection
문서에 명시적으로 포함해야 합니다. 자세한 내용은 매개변수 문서를 참조하세요.
여러 특정 필드 경로에 와일드카드 인덱스 생성
products_catalog
문서에 product_attributes
필드가 포함될 수 있는 컬렉션을 가정해 보겠습니다. product_attributes
필드에는 내장된 문서 및 배열을 포함하여 임의의 중첩 필드가 포함될 수 있습니다.
db.products_catalog.insertMany( [ { _id : ObjectId("5c1d358bf383fbee028aea0b"), product_name: "Blaster Gauntlet", product_attributes: { price: { cost: 299.99, currency: "USD" } } }, { _id: ObjectId("5c1d358bf383fbee028aea0c"), product_name: "Super Suit", product_attributes: { superFlight: true, resistance: [ "Bludgeoning", "Piercing", "Slashing" ] } } ] )
다음 작업은 와일드카드 인덱스을 생성하고 wildcardProjection
옵션을 사용하여 인덱스에 product_attributes.elements
및 product_attributes.resistance
필드의 스칼라 값만 포함합니다.
use inventory db.products_catalog.createIndexes( [ { "$**" : 1 } ], { "wildcardProjection" : { "product_attributes.elements" : 1, "product_attributes.resistance" : 1 } } )
"$**"
패턴은 문서의 모든 필드를 포함합니다. wildcardProjection
필드를 사용하여 인덱스를 지정된 필드로 제한합니다.
wildcardProjection
에 대한 전체 문서는 wildcard
인덱스에 대한 옵션을 참조하세요.
필드가 중첩된 문서 또는 배열인 경우 와일드카드 인덱스는 문서/배열로 반복되어 문서/배열의 모든 스칼라 필드를 인덱싱합니다.
와일드카드 인덱스는 wildcardProjection
에 포함된 모든 스칼라 필드에 대한 쿼리를 지원합니다.
db.products_catalog.find( { "product_attributes.elements" : { $eq: "Water" } } ) db.products_catalog.find( { "product_attributes.resistance" : "Bludgeoning" } )
참고
와일드카드 인덱스는 _id
필드를 명시적으로 포함하는 경우를 제외하고 wildcardProjection
문서에서 포함 및 제외 문을 혼합하는 것을 지원하지 않습니다. wildcardProjection
에 대한 자세한 내용은 매개변수 문서를 참조하세요.
와일드카드 인덱스 커버리지에서 특정 필드 생략
products_catalog
문서에 product_attributes
필드가 포함될 수 있는 컬렉션을 가정해 보겠습니다. product_attributes
필드에는 내장된 문서 및 배열을 포함하여 임의의 중첩 필드가 포함될 수 있습니다.
db.products_catalog.insertMany( [ { _id : ObjectId("5c1d358bf383fbee028aea0b"), product_name: "Blaster Gauntlet", product_attributes: { price: { cost: 299.99, currency: "USD" } } }, { _id: ObjectId("5c1d358bf383fbee028aea0c"), product_name: "Super Suit", product_attributes: { superFlight: true, resistance: [ "Bludgeoning", "Piercing", "Slashing" ] } } ] )
이 예시에서는 와일드카드 인덱스와 wildcardProjection
문서를 사용해 컬렉션에 포함된 각 문서의 스칼라 필드를 인덱싱합니다. 와일드카드 인덱스는 product_attributes.elements
및 product_attributes.resistance
필드를 제외합니다:
use inventory db.products_catalog.createIndexes( [ { "$**" : 1 } ], { "wildcardProjection" : { "product_attributes.elements" : 0, "product_attributes.resistance" : 0 } } )
와일드카드 패턴 "$**"
에는 문서의 모든 필드가 포함됩니다. 그러나 wildcardProjection
필드는 지정된 필드를 인덱스에서 제외합니다.
wildcardProjection
에 대한 전체 문서는 wildcard
인덱스에 대한 옵션을 참조하세요.
필드가 중첩된 문서 또는 배열인 경우 와일드카드 인덱스는 문서/배열로 반복되어 문서/배열의 모든 스칼라 필드를 인덱싱합니다.
인덱스는 wildcardProjection
으로 제외된 필드를 제외한 모든 스칼라 필드에 대한 쿼리를 지원할 수 있습니다.
db.products_catalog.find( { "product_attributes.maxSpeed" : { $gt: 25 } } ) db.products_catalog.find( { "product_attributes.superStrength" : true } )
참고
와일드카드 인덱스는 _id
필드를 명시적으로 포함하는 경우를 제외하고 wildcardProjection
문서에서 포함 및 제외 문을 혼합하는 것을 지원하지 않습니다. wildcardProjection
에 대한 자세한 내용은 매개변수 문서를 참조하세요.
쿼럼 커밋으로 인덱스 생성
참고
featureCompatibilityVersion 4.4 이상이 필요합니다.
복제본 세트 또는 샤딩된 클러스터에서 인덱스 빌드가 데이터를 보유한 모든 복제본 세트 멤버에서 동시에 진행됩니다. 샤딩된 클러스터의 경우 인덱스 빌드는 인덱싱되는 컬렉션에 대한 데이터가 포함된 샤드에서만 발생합니다. 프라이머리에는 인덱스를 사용할 준비가 된 것으로 표시하기 전에 빌드를 완료해야 하는 자신을 포함한 최소한의 데이터 보유 voting
멤버(즉, 쿼럼 커밋)가 필요합니다. 자세한 내용은 복제된 환경에서의 인덱스 빌드를 참조하세요.
쿼럼 커밋을 설정하려면 createIndexes()
를 사용하여 commitQuorum
값을 지정합니다.
commitQuorum
은 인덱스 빌드를 커밋하기 위해 준비해야 하는 데이터 보유 투표 멤버의 수 또는 프라이머리를 포함한 투표 멤버를 지정합니다. 이는 프라이머리가 커밋을 실행하기 전에 충족되어야 합니다. 기본 쿼럼 커밋은 votingMembers
이며, 이는 모든 데이터 보유 멤버를 의미합니다.
다음 연산은 쿼럼 커밋이 "majority"
인 인덱스를 생성합니다.
db.getSiblingDB("examples").invoices.createIndexes( { "invoices" : 1 }, { }, "majority" )
프라이머리는 데이터를 보유한 투표 노드의 단순 과반수가 인덱스 빌드를 커밋하기 위해 '투표'한 후에만 인덱스 빌드를 준비된 것으로 표시합니다. 인덱스 빌드와 투표 프로세스에 대한 자세한 내용은 복제된 환경에서의 인덱스 빌드를 참조하세요.
여러 인덱스 생성
캘리포니아주(CA
)와 워싱턴주(WA
)의 케이크 판매량이 포함된 cakeSales
collection을 생성합니다.
db.cakeSales.insertMany( [ { _id: 0, type: "chocolate", orderDate: new Date("2020-05-18T14:10:30Z"), state: "CA", price: 13, quantity: 120 }, { _id: 1, type: "chocolate", orderDate: new Date("2021-03-20T11:30:05Z"), state: "WA", price: 14, quantity: 140 }, { _id: 2, type: "vanilla", orderDate: new Date("2021-01-11T06:31:15Z"), state: "CA", price: 12, quantity: 145 }, { _id: 3, type: "vanilla", orderDate: new Date("2020-02-08T13:13:23Z"), state: "WA", price: 13, quantity: 104 }, { _id: 4, type: "strawberry", orderDate: new Date("2019-05-18T16:09:01Z"), state: "CA", price: 41, quantity: 162 }, { _id: 5, type: "strawberry", orderDate: new Date("2019-01-08T06:12:03Z"), state: "WA", price: 43, quantity: 134 } ] )
다음 예시에서는 cakeSales
컬렉션에 여러 인덱스를 만듭니다.
db.cakeSales.createIndexes( [ { "type": 1 }, { "orderDate": 1 }, { "state": 1 }, { "orderDate": 1, "state": -1 } ] )
처음 세 개의 인덱스는 단일 필드에 있으며 오름차순(1
)으로 정렬됩니다.
마지막 인덱스는 orderDate
에 오름차순(1
), state
에 내림차순(-1
)으로 있습니다.
추가 정보
인덱스에 대한 자세한 내용은 다음을 참조하세요.
이 설명서의 인덱스 섹션에서 MongoDB의 인덱스 및 인덱싱에 대한 전체 문서를 확인할 수 있습니다.
db.collection.getIndexes()
는 컬렉션에 대한 기존 인덱스의 사양을 나열합니다.Text Indexes on Self-Managed Deployments -
text
인덱스 생성에 대한 자세한 내용지리 공간적 쿼리에 대한 지리 공간적 인덱스 .
데이터 만료에 대한 TTL 인덱스입니다.