객체 및 문서 배열에서 필드를 인덱스하는 방법
이 페이지의 내용
참고
Atlas Search embeddedDocuments 유형, embeddedDocument 연산자 및 embedded
점수 옵션이 미리 보기로 제공됩니다. 복제본 세트 또는 단일 MongoDB 샤드의 Atlas Search 인덱스가 인덱스 객체 20억 개에 도달하면 Atlas Search는 인덱스를 실패한 실패한 상태로 전환합니다. 이 기능을 일반적으로 사용할 수 있게 되면 이러한 제한을 수용할 수 있는 솔루션이 마련될 예정입니다. 이 기능 사용과 관련된 문제를 해결하려면 지원팀 에 문의하세요. 20억 개 이상의 인덱스 객체에 대한 지원을 요청하려면 MongoDB 피드백 엔진에서 이 요청 에 투표하세요.
Atlas Search embeddedDocuments
유형을 사용하여 배열의 요소인 문서 및 객체의 필드를 인덱싱할 수 있습니다. Atlas Search는 내장된 문서를 상위 문서와 독립적으로 인덱싱합니다. 인덱싱된 각 문서에는 내장된 문서 배열 요소의 일부인 필드만 포함됩니다. embeddedDocuments
유형으로 인덱싱된 필드를 쿼리하는 데는 embeddedDocument 연산자만 사용할 수 있습니다.
참고
중첩된 각 문서를 개별적으로 쿼리할 수 있도록 embeddedDocuments
유형을 사용하여 문서 배열 내부의 필드를 인덱싱합니다. 상위 문서와 관련하여 중첩된 문서만 쿼리해야 하는 경우 객체 및 문서에서 필드를 인덱스하는 방법 유형을 사용하세요.
Atlas Search는 embeddedDocument
유형의 필드를 동적으로 인덱싱하지 않습니다. 정적 매핑을 사용하여 embeddedDocument
필드를 인덱싱해야 합니다 . Atlas UI의 비주얼 편집기 또는 JSON 편집기를 사용하여 필드를 embeddedDocument
유형으로 인덱싱할 수 있습니다.
embeddedDocuments
유형 제한 검토
embeddedDocuments
유형을 사용하는 인덱스를 만들기 전에 Lucene의 20억 개의 인덱스 객체 제한 및 기타 Atlas Search 제한 사항을 검토하세요.
루센의 20억 인덱스 객체 제한
Atlas Search는 인덱싱된 각 내장된 문서가 단일 객체로 계산되는 복제본 세트 또는 단일 샤드에서 20억 개 이상의 인덱스 객체를 인덱싱하는 것을 지원하지 않습니다. embeddedDocuments
필드 유형을 사용하면 이 제한을 초과하는 객체 인덱싱이 발생할 수 있으며, 이로 인해 인덱스가 실패한 실패한 상태로 전환될 수 있습니다.
정확한 인덱스 객체 수는 문서 변경 및 삭제 속도에 따라 달라질 수 있습니다. Lucene Docs의 최대 검색 수 지표는 모든 인덱스에서 복제본 세트 또는 샤드당 현재 인덱스 객체 수의 상한을 제공합니다. 다음을 수행하여 단일 인덱스의 예상 인덱스 객체 수를 추정할 수 있습니다.
문서당 인덱스 객체 수를 계산합니다. 모든 중첩 수준에서 각 내장된 문서는 별도의 인덱스 객체로 계산됩니다.
total number of index objects = 1 + number of nested embedded documents 문서당 인덱스 객체 수에 컬렉션의 총 문서 수를 곱합니다.
total number of index objects x total number of documents in collection
이 근사치는 하한입니다.
예제
이 튜토리얼 에 설명된 컬렉션을 schools
고려하고 컬렉션 에 1000 다음과 유사한 문서가 포함되어 있다고 가정해 보겠습니다.
{ "_id": 0, "name": "Springfield High", "mascot": "Pumas", "teachers": [ { "first": "Jane", "last": "Smith", "classes": [ { "subject": "art of science", "grade": "12th" }, ... // 2 more embedded documents ] }, ... // 1 more embedded document ], "clubs": { "stem": [ { "club_name": "chess", "description": "provides students opportunity to play the board game of chess informally and competitively in tournaments." }, ... // 1 more embedded document ], ... // 1 more embedded document } }
이제 schools
컬렉션의 다음 필드에 대한 인덱스 정의를 살펴보겠습니다.
teachers
문서 배열은 동적 매핑이 활성화된 embeddedDocuments
유형으로 인덱싱됩니다. 그러나 classes
필드 는 인덱싱되지 않습니다. 다음을 사용하여 인덱스 객체를 계산합니다.
문서당 인덱스 객체 수를 계산합니다.
Number of ``teachers`` embedded documents = up to 2 Total number of index objects per document = 1 + 2 = 3 컬렉션의 총 문서 수를 곱합니다.
Number of documents in the collection = 1000 Number of index objects per document = 3 Total number of index objects for collection = 1000 x 3 = 3000
teachers
및 teachers.classes
라는 이름의 문서 배열은 동적 매핑이 활성화된 embeddedDocuments
유형으로 인덱싱됩니다. 다음을 사용하여 인덱스 객체를 계산합니다.
문서당 인덱스 객체 수를 계산합니다.
Number of documents = 1 Number of ``teachers`` embedded documents = up to 2 Number of ``classes`` embedded documents = up to 3 Number of index objects per document = 1 + ( 2 x 3 ) = 7 컬렉션의 총 문서 수를 곱합니다.
Number of documents in the collection = 1000 Number of index objects per document = 7 Total number of index objects: 1000 x 7 = 7000
컬렉션에 20억 개의 인덱스 객체를 생성할 수 있는 대규모 배열이 있는 경우 embeddedDocuments
유형의 인덱스가 포함된 클러스터를 샤딩 해야 합니다.
Atlas Search 제한 사항
다음과 같은 제한 사항이 적용됩니다:
중첩 수준이 최대
5
수준인 필드에만embeddedDocuments
을 사용할 수 있습니다.embeddedDocuments
필드에는4
개 이상의 상위embeddedDocuments
필드를 가질 수 없습니다.embeddedDocuments
유형 내의 필드를 KNNVector 유형으로 정의할 수 없습니다.embeddedDocuments
유형으로 인덱싱된 필드의 하위 항목을 토큰 유형으로 인덱싱할 수 없습니다.내장된 문서 내의 필드를 강조 표시하려면 강조 표시하려는 필드의 상위 필드도 문서 유형으로 색인해야 합니다.
내장된 문서 하위 필드의 상위 항목을 문서 유형으로 인덱싱하는 경우에만 다음을 수행할 수 있습니다.
내장된 문서 내의 문자열 필드에 대한 패싯 검색 . 또한 패싯을 적용할 필드를 stringFacet 유형으로 인덱싱해야 합니다.
참고
포함된 문서 내의 문자열 필드에 패싯을 지정하면 Atlas Search에서 일치하는 상위 문서의 수에 대해서만 패싯 수를 반환합니다.
내장된 문서의 숫자 및 날짜 필드는 패싯을 지정할 수 없습니다.
내장된 문서 내의 필드를 강조 표시 합니다. 예제 는 배열의 객체에 대해 Atlas Search 쿼리를 실행하는 방법 튜토리얼을 참조하세요.
내장된 문서 필드의 상위 항목을 기준으로 정렬 합니다. 또한 문자열 값을 토큰 유형으로 사용하여 내장된 문서 필드를 인덱싱해야 합니다. 숫자 및 날짜 값이 있는 하위 필드의 경우 동적 매핑을 활성화하여 해당 필드를 자동으로 인덱싱합니다. 예제는 정렬 예제를 참조하세요.
유형에 대한 인덱스 정의 embeddedDocument
embeddedDocument
유형에 대한 인덱스를 정의하려면 Atlas UI에서 원하는 구성 방법을 선택한 다음 데이터베이스와 컬렉션을 선택하세요.
인덱스를 구성하려면 Refine Your Index 을 클릭합니다.
Field Mappings 섹션에서 Add Field 을 클릭하여 Add Field Mapping창을 엽니다.
Customized Configuration를 클릭합니다.
Field Name 드롭다운에서 인덱스할 필드를 선택합니다.
참고
필드 이름 시작 부분에 달러(
$
) 기호가 포함된 필드는 인덱싱할 수 없습니다.Data Type 드롭다운을 클릭하여 EmbeddedDocument를 선택합니다.
Enable Dynamic Mapping 설정을 전환하여 문서에서 동적으로 인덱스할 수 있는 모든 필드의 동적 인덱스을 활성화하거나 비활성화합니다. 자세히 알아보려면
document
필드 속성 구성을 참조하십시오.Add를 클릭합니다.
동적 매핑을 비활성화한 경우 EmbeddedDocument 유형 필드에 대해 Add Embedded Field(을)를 클릭하여 문서의 필드에 대한 필드 매핑을 정의합니다.
다음은 embeddedDocument
유형에 대한 JSON 구문입니다. 기본 인덱스 정의를 다음으로 바꿉니다. 필드에 대해 자세히 알아보려면 필드 속성 을 참조하세요.
1 { 2 "mappings": { 3 "dynamic": true|false, 4 "fields": { 5 "<field-name>": { 6 "type": "embeddedDocuments", 7 "dynamic": true|false, 8 "fields": { 9 "<field-name>": { 10 <field-mapping-definition> 11 } 12 } 13 } 14 } 15 } 16 }
embeddedDocument
필드 속성 구성
Atlas Search embeddedDocuments
유형은 다음 매개 변수를 사용합니다.
필드 | 유형 | 필요성 | 설명 | 기본값 |
---|---|---|---|---|
type | 문자열 | 필수 사항 | 필드 유형을 식별하는, 사람이 읽을 수 있는 라벨입니다. 값은 embeddedDocuments 이어야 합니다. | |
dynamic | 부울 | 옵션 | 문서에서 동적으로 인덱싱할 수 있는 모든 필드를 인덱싱할지 여부를 지정하는 플래그입니다. 값은 다음 중 하나일 수 있습니다.
| false |
fields | 문서 | 옵션 | 인덱싱할 필드.
참고Atlas Search는 | {} |
유형에 대한 예시 embeddedDocument
사용해 보기
다음 인덱스 정의 예제에서는 sample_supplies.sales 컬렉션을 사용합니다. 클러스터에 이미 샘플 데이터 가 로드되어 있는 경우, Atlas UI의 비주얼 편집기 또는 JSON 편집기를 사용하여 인덱스를 구성할 수 있습니다. 원하는 구성 방법을 선택한 후 데이터베이스와 컬렉션을 선택하고 인덱스를 수정하여 필드 매핑을 추가합니다.
다음 인덱스 정의는 items
필드에 있는 객체 배열의 인덱스를 생성합니다. 또한 items
배열의 객체 내에서 동적으로 인덱싱할 수 있는 모든 필드를 자동으로 인덱싱하도록 Atlas Search를 구성합니다.
Add Field Mapping 창의 Field Name 드롭다운에서 items 을 선택합니다.
Data Type 드롭다운을 클릭하여 EmbeddedDocuments를 선택합니다.
필요한 경우 Enable Dynamic Mapping 을 토글하여 동적 매핑을 사용하도록 설정합니다.
Add를 클릭합니다.
기본 인덱스 정의를 다음 인덱스 정의로 바꾸세요.
1 { 2 "mappings": { 3 "fields": { 4 "items": { 5 "type": "embeddedDocuments", 6 "dynamic": true 7 } 8 } 9 } 10 }
참고
Atlas Search가 자동으로 인덱스하지 않는 필드를 포함하여 포함된 문서의 모든 필드에 인덱스를 생성하려면, 인덱스 정의에서 해당 필드들을 명시하십시오. 문자열 패시팅의 경우 Atlas Search는 결과 세트의 각 문서에 대해 문자열 패싯을 한 번씩 계산합니다.
예를 들어, 다음 인덱스 정의는 items
배열의 객체 내에 있는 동적으로 인덱스 가능한 모든 필드를 자동으로 인덱스하도록 Atlas Search를 구성합니다. 또한 객체 배열 내부의 purchaseMethod
필드를 동적으로 인덱스하지 않는 stringFacet으로 인덱스하여 해당 필드에 대한 Atlas Search 패싯 쿼리를 지원하도록 구성합니다:
Field Mappings 섹션에서 Add Field 을 클릭하고 Add Field Mapping 창에서 각 필드에 대한 설정을 구성한 후 Add 을 클릭하여 다음 필드를 추가합니다.
Field Name | Data Type |
---|---|
items | 드롭다운을 클릭하고 EmbeddedDocuments 을 선택합니다. |
purchaseMethod | 드롭다운을 클릭하고 StringFacet 을 선택합니다. |
1 { 2 "mappings": { 3 "dynamic": true, 4 "fields": { 5 "items": { 6 "dynamic": true, 7 "type": "embeddedDocuments" 8 }, 9 "purchaseMethod": { 10 "type": "stringFacet" 11 } 12 } 13 } 14 }
다음 인덱스 정의는 items
객체 배열에서 name
및 tags
필드만 Atlas Search string
유형으로 인덱싱하도록 Atlas Search를 구성합니다.
Add Field Mapping 창의 Field Name 드롭다운에서 items 을 선택합니다.
Data Type 드롭다운을 클릭하여 EmbeddedDocuments를 선택합니다.
Enable Dynamic Mapping 비활성화합니다.
Add를 클릭합니다.
Field Mappings 테이블의 items 필드에 대해 Add Embedded Field 을 클릭하고 Add Embedded Field Mapping 창에서 각 필드에 대한 설정을 구성한 후 Add 를 클릭하여 다음 필드를 추가합니다.
Field NameData Typeitems.nameData Type 드롭다운을 클릭하여 String를 선택합니다.items.tagsData Type 드롭다운을 클릭하여 String를 선택합니다.
기본 인덱스 정의를 다음 인덱스 정의로 바꾸세요.
1 { 2 "mappings": { 3 "fields": { 4 "items": { 5 "type": "embeddedDocuments", 6 "dynamic": false, 7 "fields": { 8 "name": { 9 "type": "string" 10 }, 11 "tags": { 12 "type": "string" 13 } 14 } 15 } 16 } 17 } 18 }