Docs Menu
Docs Home
/
MongoDB 매뉴얼
/ / /

createIndexes

이 페이지의 내용

  • 정의
  • 호환성
  • 구문
  • 명령 필드
  • 고려 사항
  • 인덱스 이름
  • 복제본 세트 및 샤딩된 클러스터
  • 데이터 정렬 및 인덱스 유형
  • Stable API
  • 행동
  • 동시성
  • 메모리 사용량 제한
  • 인덱스 옵션
  • 와일드카드 인덱스
  • 트랜잭션
  • 쓰기 우려와 대조되는 쿼럼 커밋
  • 예시
  • 와일드카드 인덱스 만들기
  • 쿼럼 커밋으로 인덱스 생성
  • 출력
createIndexes

컬렉션에 대해 하나 이상의 인덱스를 작성합니다.

mongosh 에서 이 명령은 db.collection.createIndex()db.collection.createIndexes() 헬퍼 메서드를 통해서도 실행 수 있습니다.

헬퍼 메서드는 mongosh 사용자에게 편리하지만 데이터베이스 명령과 동일한 수준의 정보를 반환하지 못할 수 있습니다. 편의가 필요하지 않거나 추가 리턴 필드가 필요한 경우 데이터베이스 명령을 사용합니다.

이 명령은 다음 환경에서 호스팅되는 배포에서 사용할 수 있습니다.

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

참고

이 명령은 모든 MongoDB Atlas 클러스터에서 지원됩니다. 모든 명령에 대한 Atlas 지원에 대한 자세한 내용은 지원되지 않는 명령을 참조하세요.

createIndexes 명령은 다음 형식을 취합니다.

db.runCommand(
{
createIndexes: <collection>,
indexes: [
{
key: {
<key-value_pair>,
<key-value_pair>,
...
},
name: <index_name>,
<option1>,
<option2>,
...
},
{ ... },
{ ... }
],
writeConcern: { <write concern> },
commitQuorum: <int|string>,
comment: <any>
}
)

createIndexes 명령은 다음 필드를 사용합니다.

필드
유형
설명
createIndexes
문자열
인덱스를 생성할 컬렉션입니다.
indexes
배열
생성할 인덱스를 지정합니다. 배열의 각 문서는 별도의 인덱스를 지정합니다.
writeConcern
문서
선택 사항입니다. 쓰기 고려를 표현하는 문서입니다. 기본 쓰기 고려를 사용하지 않으려면 생략하세요.
commitQuorum
정수 또는 문자열

선택 사항입니다. 프라이머리 등 데이터를 보유하는 복제본 세트 멤버의 최소 수(즉, 쿼럼 커밋)이며, 이는 프라이머리가 indexes를 준비됨으로 표시하기 전에 성공적인 인덱스 빌드를 보고해야 합니다.

MongoDB v5.0부터는 "votingMembers"commit quorum is set될 때 일부 중단된 인덱스 빌드를 다시 시작할 수 있습니다.

쿼럼 커밋의 복제본 세트 노드에서 members[n].buildIndexestrue로 설정되어 있어야 합니다. 투표 노드에 members[n].buildIndexesfalse로 설정된 경우 기본 "votingMembers" 쿼럼 커밋을 사용할 수 없습니다. 모든 노드를 members[n].buildIndexes true로 구성하거나 다른 쿼럼 커밋을 선택합니다.

는 다음과 같은 값을 지원합니다.

  • "votingMembers" - 모든 데이터를 보유하는 투표 복제본 세트 멤버(기본값)입니다. "투표" 멤버는 members[n].votes0보다 큰 모든 복제본 세트 노드를 말합니다.

  • "majority" - 데이터 보유 복제본 세트 멤버의 단순 과반수입니다.

  • <int> - 특정 수의 데이터를 보유하는 복제본 세트 멤버입니다.

  • 0 - 쿼럼 투표 동작을 사용하지 않도록 설정합니다. 멤버는 인덱스 작성을 동시에 시작하지만 인덱스 작성을 완료하기 전에 투표하거나 쿼럼을 기다리지 않습니다. 쿼럼 커밋이 0인 인덱스 빌드를 시작하는 경우 나중에 setIndexCommitQuorum를 사용하여 쿼럼 커밋을 수정할 수 없습니다.

  • 복제본 세트 태그 이름.

comment
any

선택 사항. 이 명령에 첨부할 사용자 제공 코멘트입니다. 설정되면 이 설명은 다음 위치에서 이 명령의 레코드와 함께 표시됩니다.

댓글은 유효한 모든 BSON types (문자열, 정수, 객체, 배열 등)이 될 수 있습니다.

indexes 배열의 각 문서는 다음 필드를 사용할 수 있습니다.

필드
유형
설명
key
문서

인덱스의 필드를 지정합니다. 각 필드에 대해 키는 인덱싱할 필드 이름이고 값은 인덱스 방향 또는 인덱스 유형인 키-값 쌍을 지정합니다. 방향을 지정하는 경우, 오름차순이면 1, 내림차순이면 -1을 지정합니다.

MongoDB는 다음과 같은 여러 가지 인덱스 유형을 지원합니다.

자세한 내용은 인덱스 유형을 참조하세요.

와일드카드 인덱스는 사용자가 사용자 지정 필드 또는 컬렉션의 다양한 필드에 대해 쿼리하는 워크로드를 지원합니다.

  • 특정 필드와 해당 하위 경로 또는 문서의 모든 필드에 와일드카드 인덱스를 생성할 수 있습니다.

    자세한 내용은 복합 와일드카드 인덱스를 참조하세요.

name
문자열
인덱스를 고유하게 식별하는 이름입니다.
unique
부울

선택 사항입니다. 고유 인덱스를 생성하여 인덱스 키 값이 인덱스의 기존 값과 일치하는 문서의 삽입 또는 업데이트를 collection에서 허용하지 않도록 합니다.

고유 인덱스를 생성하려면 true를 지정합니다. 기본값은 false입니다.

해시된 인덱스에는 이 옵션을 사용할 수 없습니다.

partialFilterExpression
문서

선택 사항. 지정된 경우 인덱스는 필터 표현식과 일치하는 문서만 참조합니다. 자세한 내용은 부분 인덱스를 참조하세요.

필터 표현식에는 다음이 포함될 수 있습니다.

클라이언트 사이드 필드 수준 암호화 또는 Queryable Encryption을 사용하는 경우 partialFilterExpression 은 암호화된 필드를 참조할 수 없습니다.

모든 MongoDB 인덱스 유형partialFilterExpression 옵션을 지정할 수 있습니다.

sparse
부울

선택 사항. true인 경우 인덱스는 지정된 필드가 있는 문서만 참조합니다. 이러한 인덱스는 공간을 덜 사용하지만 일부 상황(특히 정렬)에서는 다르게 동작합니다. 기본값은 false입니다. 자세한 내용은 희소 인덱스를 참조하세요.

다음 인덱스 유형은 기본적으로 희박하며 이 옵션을 무시합니다.

다른 유형의 키와 함께 2dsphere 인덱스 키를 포함하는 복합 인덱스의 경우, 2dsphere 인덱스 필드만이 인덱스가 문서를 참조하는지 여부를 결정합니다.

MongoDB는 부분 인덱스를 생성하는 옵션을 제공합니다. 이는 희소 인덱스 기능의 상위 집합을 제공하므로 대신 선호됩니다.

expireAfterSeconds
integer

선택 사항. MongoDB가 이 컬렉션에 문서를 보관하는 기간을 제어하기 위해 TTL(Time To Live)로 초 단위의 값을 지정합니다. 이 옵션은 TTL 인덱스에만 적용됩니다. 자세한 내용은 TTL을 설정하여 컬렉션에서 데이터 만료하기를 참조하세요.

MongoDB 5.0 이전에 생성된 TTL 인덱스를 사용하거나 MongDB 5.0에서 생성된 데이터를 5.0 이전 설치와 동기화하려는 경우 잘못된 구성 문제를 방지하려면 NaN을 사용하여 구성된 인덱스를 참조하세요.

TTL 인덱스 expireAfterSeconds 값은 02147483647 사이여야 합니다.

부울

선택 사항입니다. 쿼리 플래너에서 인덱스를 숨길지 여부를 결정하는 플래그입니다. 숨겨진 인덱스는 쿼리 계획 선택의 일부로 평가되지 않습니다.

기본값은 false입니다.

storageEngine
문서

선택 사항입니다. 사용자가 인덱스를 생성할 때 인덱스별로 스토리지 엔진을 구성할 수 있습니다.

storageEngine 옵션은 다음과 같은 형식이어야 합니다:

storageEngine: { <storage-engine-name>: <options> }

인덱스를 만들 때 지정한 스토리지 엔진 구성 옵션은 다른 스토리지 엔진을 사용하는 멤버가 있는 복제본 세트를 지원하기 위해 복제 중에 유효성이 검사되고 oplog에 기록됩니다.

weights
문서
선택 사항. 텍스트 인덱스의 경우 필드 및 가중치 쌍을 포함하는 문서입니다. 가중치는 1~99,999 범위의 정수이며, 인덱싱된 다른 필드에 대한 해당 필드의 중요도를 점수 측면에서 나타냅니다. 인덱싱된 일부 필드 또는 모든 필드에 가중치를 지정할 수 있습니다. 점수를 조정하려면 자체 관리형 배포에서 텍스트 검색 결과에 가중치 할당하기를 참조하세요. 기본값은 1입니다.
default_language
문자열

선택 사항. 텍스트 인덱스의 경우 이 언어는 중지 단어 목록과 어간 및 토크나이저에 대한 규칙을 결정합니다. 자세한 내용과 예시는 사용 가능한 언어에 대한 자체 관리형 배포의 텍스트 검색 언어자체 관리형 배포의 텍스트 인덱스에 대한 기본 언어 지정을 참조하세요. 기본값은 english입니다.

language_override
문자열
선택 사항입니다. 텍스트 인덱스에서 컬렉션 문서의 필드 이름으로, 문서의 재정의 언어를 포함합니다. 기본값은 language입니다. 예시는 자체 관리 배포에서 텍스트 인덱스의 기본 언어 지정을 참조하세요.
textIndexVersion
integer

선택 사항. text 인덱스 버전 번호입니다. 사용자는 이 옵션을 사용하여 기본 버전 번호를 재정의할 수 있습니다.

사용 가능한 버전은 자체 관리형 배포에 대한 텍스트 인덱스 버전을 참조하세요.

2dsphereIndexVersion
integer

선택 사항. 2dsphere 인덱스 버전 번호입니다. 사용자는 이 옵션을 사용하여 기본 버전 번호를 재정의할 수 있습니다.

사용 가능한 버전은 2dsphere 인덱스를 참고하세요.

bits
integer

선택 사항. 2D 인덱스의 경우 위치 데이터의 저장된 geohash 값의 정밀도 수입니다.

bits 값의 범위는 1에서 32까지입니다. 기본값은 26입니다.

min
숫자
선택 사항입니다. 2d 인덱스의 경우 경도 및 위도 값의 하한 포함 경계입니다. 기본값은 -180.0입니다.
max
숫자
선택 사항입니다. 2D 인덱스의 경우 경도 및 위도 값의 상한값입니다. 기본값은 180.0입니다.
collation
문서

선택 사항입니다. 인덱스의 데이터 정렬을 지정합니다.

데이터 정렬을 사용하면 대소문자 및 악센트 표시 규칙과 같은 문자열 비교에 대한 언어별 규칙을 지정할 수 있습니다.

collection 수준에서 데이터 정렬을 지정한 경우:

  • 인덱스를 생성할 때 데이터 정렬을 지정하지 않으면 MongoDB는 collection의 기본 데이터 정렬을 사용하여 인덱스를 생성합니다.

  • 인덱스를 생성할 때 데이터 정렬을 지정하면 MongoDB는 지정된 데이터 정렬로 인덱스를 생성합니다.

데이터 정렬 옵션의 구문은 다음과 같습니다:

collation: {
locale: <string>,
caseLevel: <boolean>,
caseFirst: <string>,
strength: <int>,
numericOrdering: <boolean>,
alternate: <string>,
maxVariable: <string>,
backwards: <boolean>
}

데이터 정렬을 지정할 때 locale 필드는 필수이고, 다른 데이터 정렬 필드는 모두 선택 사항입니다. 필드에 대한 설명은 데이터 정렬 문서를 참조하세요.

wildcardProjection
문서

선택 사항.

사용자가 { "$**" : 1} 키 패턴을 사용하여 와일드카드 인덱스에서 특정 필드 경로를 포함하거나 제외할 수 있습니다. 이 옵션은 모든 문서 필드에 와일드카드 인덱스를 생성하는 경우에만 유효합니다. 특정 필드 경로 및 해당 하위 필드에 와일드카드 인덱스를 생성하는 경우에는 이 옵션을 지정할 수 없습니다(예: { "path.to.field.$**" : 1 }).

wildcardProjection 옵션은 다음과 같은 형식을 취합니다.

wildcardProjection: {
"path.to.field.a" : <value>,
"path.to.field.b" : <value>
}

<value> 다음 중 하나일 수 있습니다.

  • 1 또는 true를 입력하여 와일드카드 인덱스에 필드를 포함시킵니다.

  • 0 또는 false를 입력하여 와일드카드 인덱스에서 필드를 제외합니다.

와일드카드 인덱스는 기본적으로 _id 필드를 생략합니다. 와일드카드 인덱스에 _id 필드를 포함하려면 해당 필드를 wildcardProjection 문서에 명시적으로 포함해야 합니다.

{
"wildcardProjection" : {
"_id" : 1,
"<field>" : 0|1
}
}

wildcardProjection 문서의 모든 명령문은 포함문 또는 제외문이어야 합니다. 제외문과 함께 _id 필드를 포함할 수도 있습니다. 이는 규칙의 유일한 예외입니다.

mongoshcreateIndexes 명령에 대한 래퍼(wrapper)로 db.collection.createIndex()db.collection.createIndexes() 메서드를 제공합니다.

MongoDB는 버전 0 인덱스 생성을 허용하지 않습니다.

createIndexes 명령과 mongosh 헬퍼 db.collection.createIndex()db.collection.createIndexes()는 한 이름으로 인덱스를 만든 다음 다른 이름으로 동일한 인덱스를 다시 만들려고 하면 오류를 보고합니다.

{
"ok" : 0,
"errmsg" : "Index with name: x_1 already exists with a different name",
"code" : 85,
"codeName" : "IndexOptionsConflict"
}

이전 버전의 MongoDB에서는 인덱스를 다시 생성하지 않고 ok 값이 1인 응답 객체와 인덱스가 다시 생성되지 않았음을 암시하는 메모를 반환했습니다. 예시:

{
"numIndexesBefore" : 2,
"numIndexesAfter" : 2,
"note" : "all indexes already exist",
"ok" : 1
}

참고

featureCompatibilityVersion 4.4 이상이 필요합니다.

복제본 mongod 세트 또는 샤딩된 클러스터의 각 4.4 에는 복제본 세트 멤버 간에 인덱스 빌드를 동시에 시작할 수 있도록 featureCompatibilityVersion 이 이상으로 설정되어 있어야 합니다 .

복제본 세트 또는 샤딩된 클러스터에서 인덱스 빌드가 데이터를 보유한 모든 복제본 세트 멤버에서 동시에 진행됩니다. 샤딩된 클러스터의 경우 인덱스 빌드는 인덱싱되는 컬렉션에 대한 데이터가 포함된 샤드에서만 발생합니다. 프라이머리에는 인덱스를 사용할 준비가 된 것으로 표시하기 전에 빌드를 완료해야 하는 자신을 포함한 최소한의 데이터 보유 voting 멤버(즉, 쿼럼 커밋)가 필요합니다. 자세한 내용은 복제된 환경에서의 인덱스 빌드를 참조하세요.

기본이 아닌 쿼럼 커밋으로 인덱스 빌드를 시작하려면 commitQuorum을 지정합니다.

setIndexCommitQuorum 명령을 사용하여 진행 중인 인덱스 빌드의 쿼럼 커밋을 수정합니다.

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

다음 인덱스는 단순 바이너리 비교만 지원하며 데이터 정렬은 지원하지 않습니다.

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

Stable API V1을 사용하는 경우:

  • indexes 배열에는 다음 필드 중 어느 것도 지정할 수 없습니다.

    • background

    • bucketSize

    • sparse

    • storageEngine

  • geoHaystack 또는 텍스트 인덱스는 생성할 수 없습니다.

  • 위의 지원되지 않는 인덱스 유형은 엄격 모드 에서 쿼리 플래너 에 의해 무시됩니다. 예를 예시 sparse 인덱스 를 cursor.hint() 와 함께 사용하려고 하면 다음과 같은 BadValue 오류가 발생합니다.

    planner returned error :: caused by :: hint provided does not
    correspond to an existing index

featureCompatibilityVersion "4.2"의 경우 createIndexes에서는 인덱스 빌드의 시작과 끝에서 지정된 컬렉션에 대한 배타 락을 가져오고 보유하는 최적화된 빌드 프로세스를 사용합니다. 컬렉션에 대한 모든 후속 작업은 createIndexes가 배타적 잠금을 해제할 때까지 기다려야 합니다. createIndexes는 대부분의 인덱스 빌드 중에 읽기 및 쓰기 작업의 교차를 허용합니다.

featureCompatibilityVersion "4.0"의 경우, createIndexes은 4.2 이전 인덱스 빌드 프로세스를 사용하며 이는 기본적으로 전체 빌드 프로세스 기간 동안 상위 데이터베이스에 대한 배타 락을 가집니다. 4.2 이전 빌드 프로세스는 작업이 완료될 때까지 데이터베이스 모든 해당 컬렉션에 대한 모든 작업을 차단합니다. background 인덱스는 배타적 잠금을 사용하지 않습니다.

createIndexes의 잠금 동작에 대한 자세한 내용은 채워진 컬렉션에 대한 인덱스 빌드를 참조하세요.

중요

데이터를 포함하는 투표 노드 에 연결할 수 없게 되고 commitQuorum 이 기본값 votingMembers 으로 설정하다 되면 해당 노드 가 온라인 가 될 때까지 인덱스 빌드가 중단될 수 있습니다.

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

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

인덱스를 제거하고 다시 생성하지 않고도 숨김 옵션을 변경할 수 있습니다. 숨김 옵션을 참조하세요.

기존 인덱스의 데이터 정렬 옵션을 업데이트할 수 있습니다. 다른 인덱스 옵션을 변경하려면 db.collection.dropIndex()로 기존 인덱스를 제거한 다음 새 옵션으로 createIndexes를 실행합니다.

동일한 키에 서로 다른 데이터 정렬을 사용하여 여러 인덱스를 생성할 수 있습니다. 키 패턴은 같지만 데이터 정렬이 다른 고유한 인덱스를 만들려면 고유한 인덱스 이름을 입력해야 합니다.

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에는 숫자 필드 scoreprice와 문자열 필드 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" 키와 일치하지 않습니다. 이는 강도 매개변수에 설정한 값에 관계없이 적용됩니다.

기존 인덱스의 hidden 옵션을 변경하려면 다음 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)인 아닌 경우 분산 트랜잭션 내에서 컬렉션과 인덱스를 생성할 수 있습니다.

트랜잭션에서 createIndexes를 사용하려면 트랜잭션에서 읽기 고려 "local"를 사용해야 합니다. "local" 이외의 읽기 고려 수준을 지정하면 트랜잭션이 실패합니다.

쿼럼 커밋쓰기 문제 사이에는 중요한 차이점이 있습니다.

  • 인덱스 빌드는 쿼럼 커밋 사용합니다.

  • 쓰기 작업은 쓰기 고려 사용합니다.

클러스터 내의 각 데이터 보유 노드는 투표권을 가진 노드입니다.

커밋 쿼럼은 프라이머리 멤버를 포함하여 몇 개의 데이터 보유 투표 멤버 또는 어떤 투표 멤버가 동시 인덱스 빌드를 커밋할 준비가 되어 있어야 하는지를 지정합니다. 이 준비가 완료되면 프라이머리 멤버가 커밋을 실행합니다.

쓰기 고려는 쓰기 작업이 지정된 수의 인스턴스로 전파되었다는 확인 수준입니다.

8.0 버전 변경 사항: 커밋 쿼럼은 프라이머리가 인덱스 빌드를 커밋하기 전에 인덱스 빌드를 완료할 준비가 되어 있어야 하는 노드 수를 지정합니다. 반대로 프라이머리가 인덱스 빌드를 커밋한 경우 쓰기 고려는 명령이 성공을 반환하기 전에 인덱스 빌드 oplog 항목을 복제해야 하는 노드 수를 지정합니다.

이전 릴리스에서는 프라이머리가 인덱스 빌드를 커밋했을 때 쓰기 고려가 명령이 성공적으로 반환되기 전에 인덱스 빌드를 완료해야 하는 노드 수를 지정했습니다.

다음 명령은 products 데이터베이스의 inventory 컬렉션에 두 개의 인덱스를 빌드합니다.

db.getSiblingDB("products").runCommand(
{
createIndexes: "inventory",
indexes: [
{
key: {
item: 1,
manufacturer: 1,
model: 1
},
name: "item_manufacturer_model",
unique: true
},
{
key: {
item: 1,
supplier: 1,
model: 1
},
name: "item_supplier_model",
unique: true
}
],
writeConcern: { w: "majority" }
}
)

인덱스 빌드가 성공적으로 완료되면, MongoDB는 "ok" : 1 상태를 포함하는 결과 문서를 반환합니다.

참고

와일드카드 인덱스에 대한 전체 문서는 와일드카드 인덱스를 참조하세요.

다음은 와일드카드 인덱스 생성의 예입니다.

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.runCommand(
{
createIndexes: "products_catalog",
indexes: [
{
key: { "product_attributes.$**" : 1 },
name: "wildcardIndex"
}
]
}
)

이 와일드카드 인덱스를 사용하면 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.runCommand(
{
createIndexes: "products_catalog",
indexes: [
{
key: { "$**" : 1 },
name: "wildcardIndex"
}
]
}
)

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.elementsproduct_attributes.resistance 필드의 스칼라 값만 포함합니다.

use inventory
db.runCommand(
{
createIndexes: "products_catalog",
indexes: [
{
key: { "$**" : 1 },
"wildcardProjection" : {
"product_attributes.elements" : 1,
"product_attributes.resistance" : 1
},
name: "wildcardIndex"
}
]
}
)

키 패턴 "$**"는 문서의 모든 필드를 포함하지만 wildcardProjection 필드는 포함된 필드와 중첩된 필드로만 인덱스을 제한합니다.

필드가 중첩된 문서 또는 배열인 경우 와일드카드 인덱스는 문서/배열로 반복되어 문서/배열의 모든 스칼라 필드를 인덱싱합니다.

생성된 인덱스는 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.elementsproduct_attributes.resistance 필드를 제외한 컬렉션의 각 문서에 대한 모든 스칼라 필드를 인덱싱합니다.

use inventory
db.runCommand(
{
createIndexes: "products_catalog",
indexes: [
{
key: { "$**" : 1 },
"wildcardProjection" : {
"product_attributes.elements" : 0,
"product_attributes.resistance" : 0
},
name: "wildcardIndex"
}
]
}
)

키 패턴 "$**"는 문서의 모든 필드를 포함하지만 wildcardProjection 필드는 지정된 필드를 인덱스에서 제외합니다.

필드가 중첩된 문서 또는 배열인 경우 와일드카드 인덱스는 문서/배열로 반복되어 문서/배열의 모든 스칼라 필드를 인덱싱합니다.

생성된 인덱스는 wildcardProjection으로 제외된 필드를 제외한 모든 스칼라 필드에 대한 쿼리를 지원할 수 있습니다.

db.products_catalog.find( { "product_attributes.maxSpeed" : { $gt: 25 } } )
db.products_catalog.find( { "product_attributes.superStrength" : true } )

참고

와일드카드 인덱스는 _id 필드를 명시적으로 포함하는 경우를 제외하고 wildcardProjection 문서에서 포함 및 제외 문을 혼합하는 것을 지원하지 않습니다. wildcardProjection에 대한 자세한 내용은 매개변수 문서를 참조하세요.

참고

featureCompatibilityVersion 4.4 이상이 필요합니다.

복제본 mongod 세트 또는 샤딩된 클러스터의 각 4.4 에는 복제본 세트 멤버 간에 인덱스 빌드를 동시에 시작할 수 있도록 featureCompatibilityVersion 이 이상으로 설정되어 있어야 합니다 .

복제본 세트 또는 샤딩된 클러스터에서 인덱스 빌드가 데이터를 보유한 모든 복제본 세트 멤버에서 동시에 진행됩니다. 샤딩된 클러스터의 경우 인덱스 빌드는 인덱싱되는 컬렉션에 대한 데이터가 포함된 샤드에서만 발생합니다. 프라이머리에는 인덱스를 사용할 준비가 된 것으로 표시하기 전에 빌드를 완료해야 하는 자신을 포함한 최소한의 데이터 보유 voting 멤버(즉, 쿼럼 커밋)가 필요합니다. 자세한 내용은 복제된 환경에서의 인덱스 빌드를 참조하세요.

커밋 쿼럼을 설정하려면 createIndexes(을)를 사용하여 commitQuorum 값을 지정합니다.

commitQuorum 은 인덱스 빌드를 커밋하기 위해 준비해야 하는 데이터 보유 투표 멤버의 수 또는 프라이머리를 포함한 투표 멤버를 지정합니다. 이는 프라이머리가 커밋을 실행하기 전에 충족되어야 합니다. 기본 쿼럼 커밋은 votingMembers이며, 이는 모든 데이터 보유 멤버를 의미합니다.

다음 작업은 "majority"쿼럼 커밋 또는 데이터 보유 노드의 단순 과반수를 사용하여 인덱스를 생성합니다.

db.getSiblingDB("examples").runCommand(
{
createIndexes: "invoices",
indexes: [
{
key: { "invoices" : 1 },
"name" : "invoiceIndex"
}
],
"commitQuorum" : "majority"
}
)

프라이머리는 데이터를 보유한 투표 노드의 단순 과반수가 인덱스 빌드를 커밋하기 위해 '투표'한 후에만 인덱스 빌드를 준비된 것으로 표시합니다. 인덱스 빌드와 투표 프로세스에 대한 자세한 내용은 복제된 환경에서의 인덱스 빌드를 참조하세요.

createIndexes 명령은 작업의 성공을 나타내는 문서를 반환합니다. 문서에는 결과에 따라 다음 필드 중 일부 또는 전부가 포함될 수 있습니다.

createIndexes.createdCollectionAutomatically

true인 경우 컬렉션이 존재하지 않았으며 인덱스를 생성하는 과정에서 생성된 것입니다.

createIndexes.numIndexesBefore

명령이 시작될 때의 인덱스 수입니다.

createIndexes.numIndexesAfter

명령이 끝날 때의 인덱스 수입니다.

createIndexes.ok

값이 1인 경우 인덱스가 제자리에 있음을 나타냅니다. 0 값은 오류를 나타냅니다.

createIndexes.note

기존 인덱스가 이미 있는 경우 이 note가 반환됩니다. 이는 인덱스가 생성되거나 변경되지 않았음을 나타냅니다.

createIndexes.errmsg

오류에 대한 정보를 반환합니다.

createIndexes.code

오류 유형을 나타내는 오류 코드입니다.

돌아가기

create