Docs Menu
Docs Home
/
MongoDB Atlas
/ / / /

객체 및 문서 배열에서 필드를 인덱스하는 방법

이 페이지의 내용

  • embeddedDocuments 유형 제한 검토
  • 인덱스 개체 2,100,000,000개 제한
  • atlas search 제한 사항
  • 0} 유형에 대한 인덱스 정의 embeddedDocument
  • 0}embeddedDocument 필드 속성 구성
  • 0} 유형에 대한 예시를 사용해 보세요.embeddedDocument

참고

Atlas Search embeddedDocuments 유형, embeddedDocument 연산자 및 embedded 점수 옵션이 미리 보기로 제공됩니다. 복제본 세트 또는 단일 MongoDB 샤드 의 Atlas Search 인덱스 가 2,100,000,000 인덱스 객체에 도달하면 Atlas Search 는 인덱스 를 오래된 쿼리 가능 상태 로 전환합니다. 향후 Atlas Search 에서 2 100, ,000, 이상의 인덱스000 객체를 지원 하려면 MongoDB 피드백 엔진에서 이 요청 에 투표하세요.

Atlas Search embeddedDocuments 유형을 사용하여 배열의 요소인 문서 및 객체의 필드를 인덱싱할 수 있습니다. Atlas Search는 내장된 문서를 상위 문서와 독립적으로 인덱싱합니다. 각 인덱스된 문서에는 내장된 문서 배열 요소의 일부인 필드만 포함됩니다. embeddedDocuments 유형으로 인덱싱된 필드를 쿼리하는 데는 embeddedDocument 연산자만 사용할 수 있습니다.

참고

embeddedDocuments 유형을 사용하여 문서 배열 내의 필드를 인덱싱하면 중첩된 각 문서를 개별적으로 쿼리할 수 있습니다. 부모 문서와 관련하여 중첩된 문서만 쿼리하면 되는 경우 개체 및 문서의 필드 인덱싱 방법 유형을 사용하세요.

Atlas Search는 embeddedDocument유형의 필드를 동적으로 인덱싱하지 않습니다. 정적 매핑을 사용하여 embeddedDocument 필드를 인덱싱해야 합니다 . Atlas UI의 비주얼 편집기 또는 JSON 편집기를 사용하여 필드를 embeddedDocument 유형으로 인덱싱할 수 있습니다.

embeddedDocuments 유형을 사용하는 인덱스를 만들기 전에 2,100,000,000 인덱스 객체 제한 및 기타 Atlas Search 제한 사항을 검토하세요.

Atlas Search는 인덱싱된 임베디드 문서 각각이 단일 객체로 간주되는 복제본 세트 또는 단일 샤드에서 2,100,000,000 인덱스 객체보다 큰 인덱스에 대한 변경 사항 복제를 중단합니다. embeddedDocuments 필드 유형을 사용하면 이 제한을 초과하여 객체 인덱스가 생성될 수 있으며, 이로 인해 인덱스가 Stale 쿼리 가능 상태로 전환되어 결과가 부실해질 수 있습니다.

정확한 인덱스 객체 수는 문서 변경 및 삭제 속도에 따라 달라질 수 있습니다. Search Max Lucene Docs 지표는 복제본 세트 또는 샤드당 모든 인덱스의 현재 인덱스 객체 수의 상한을 제공합니다. 다음을 수행하여 단일 인덱스의 예상 인덱스 객체 수를 대략적으로 추정할 수 있습니다.

  1. 문서당 인덱스 객체 수를 계산합니다. 모든 수준의 중첩에 대해 각 내장된 문서는 별도의 인덱스 객체로 계산됩니다.

    total number of index objects = 1 + number of nested embedded documents
  2. 문서당 인덱스 객체 수에 컬렉션의 총 문서 수를 곱합니다.

    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 필드는 인덱싱되지 않았습니다. 다음을 사용하여 인덱스 객체를 계산합니다.

  1. 문서당 인덱스 객체 수를 계산합니다.

    Number of ``teachers`` embedded documents = up to 2
    Total number of index objects per document = 1 + 2 = 3
  2. 컬렉션의 총 문서 수에 곱합니다.

    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

이름이 teachersteachers.classes인 문서 배열은 동적 매핑이 활성화된 embeddedDocuments 유형으로 인덱싱됩니다. 다음을 사용하여 인덱스 객체를 계산합니다.

  1. 문서당 인덱스 객체 수를 계산합니다.

    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
  2. 컬렉션의 총 문서 수에 곱합니다.

    Number of documents in the collection = 1000
    Number of index objects per document = 7
    Total number of index objects: 1000 x 7 = 7000

컬렉션에 2,100,000,000개의 인덱스 객체를 생성할 수 있는 대규모 배열이 있는 경우 embeddedDocuments 유형의 인덱스가 포함된 클러스터를 샤딩해야 합니다.

다음과 같은 제한 사항이 적용됩니다:

  • 중첩 수준이 최대 5 수준인 필드에만 embeddedDocuments을 사용할 수 있습니다. embeddedDocuments 필드에는 4개 이상의 상위 embeddedDocuments 필드를 가질 수 없습니다.

  • 날짜 또는 숫자 패싯에는 embeddedDocuments 를 사용할 수 없습니다.

  • 더 이상 사용되지 않는 knnVector 유형으로 embeddedDocuments 유형 내부의 필드를 정의할 수 없습니다.

  • embeddedDocuments 유형으로 인덱싱된 필드의 하위 항목을 토큰 유형으로 인덱싱할 수 없습니다.

  • 내장된 문서 내의 필드를 강조 표시하려면 강조 표시하려는 필드의 상위 필드도 문서 유형으로 색인해야 합니다.

  • 다음 작업은 내장된 문서 자식 필드의 부모를 문서 유형으로 인덱싱하는 경우에만 수행할 수 있습니다.

    • 내장 문서 내 문자열 필드에 대한 패싯 검색을 수행합니다. 또한 stringFacet 유형으로 패싯을 적용할 필드를 인덱싱해야 합니다.

      참고

      포함된 문서 내의 문자열 필드에 패싯을 지정하면 Atlas Search에서 일치하는 상위 문서의 수에 대해서만 패싯 수를 반환합니다.

      내장된 문서의 숫자 및 날짜 필드는 패싯을 지정할 수 없습니다.

    • 내장된 문서 내의 필드를 강조 표시합니다. 예시에 대해서는 배열의 객체에 대해 Atlas Search 쿼리를 실행하는 방법 튜토리얼을 참조하세요.

    • 내장된 문서 필드의 부모를 기준으로 정렬합니다. 또한 문자열 값을 토큰 유형으로 사용하여 포함된 문서 필드를 인덱싱해야 합니다. 숫자와 날짜 값이 있는 자식 필드의 경우 동적 매핑을 활성화하여 해당 필드를 자동으로 인덱싱합니다. 예를 보려면 정렬 예시를 참조하세요.

embeddedDocument 유형에 대한 인덱스를 정의하려면 Atlas UI에서 원하는 구성 방법을 선택한 다음 데이터베이스와 컬렉션을 선택하세요.

  1. 인덱스를 구성하려면 Refine Your Index를 클릭합니다.

  2. Field Mappings 섹션에서 Add Field 을 클릭하여 Add Field Mapping창을 엽니다.

  3. Customized Configuration를 클릭합니다.

  4. Field Name 드롭다운에서 인덱스할 필드를 선택합니다.

    참고

    필드 이름 시작 부분에 달러($) 기호가 포함된 필드는 인덱싱할 수 없습니다.

  5. Data Type 드롭다운을 클릭하여 EmbeddedDocument를 선택합니다.

  6. Enable Dynamic Mapping 설정을 전환하여 문서에서 동적으로 인덱스할 수 있는 모든 필드의 동적 인덱스을 활성화하거나 비활성화합니다. 자세히 알아보려면 document 필드 속성 구성을 참조하십시오.

  7. Add를 클릭합니다.

  8. 동적 매핑을 비활성화한 경우 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}

Atlas Search embeddedDocuments 유형은 다음 매개 변수를 사용합니다.

필드
유형
필요성
설명
기본값
type
문자열
필수 사항
필드 유형을 식별하는, 사람이 읽을 수 있는 라벨입니다. 값은 embeddedDocuments이어야 합니다.
dynamic
부울
옵션

문서에서 동적으로 인덱싱할 수 있는 모든 필드를 인덱싱할지 여부를 지정하는 플래그입니다. 값은 다음 중 하나일 수 있습니다.

  • true - 인덱싱 가능한 모든 필드를 인덱싱합니다.

  • false - 인덱싱 가능한 모든 필드를 인덱싱하지 않습니다.

false
fields
문서
옵션

인덱싱할 필드.

dynamictrue면 Atlas Search는 인덱싱 가능한 모든 필드를 인덱싱합니다.

dynamicfalsefields에 대한 필드 정의에서 인덱싱할 필드를 지정할 수 있습니다.

Atlas Search는 embeddedDocuments 필드의 일부로 패싯 필드를 인덱싱하는 것을 지원하지 않습니다.

{}

다음 인덱스 정의 예시에서는 sample_supplies.sales collection을 사용합니다. cluster에 이미 샘플 데이터가 로드되어 있는 경우, Atlas UI의 Visual Editor 또는 JSON Editor를 사용하여 인덱스를 구성할 수 있습니다. 원하는 구성 방법을 선택한 후 데이터베이스와 컬렉션을 선택하고 인덱스를 구체화하여 필드 매핑을 추가합니다.

다음 인덱스 정의는 items 필드에 있는 객체 배열의 인덱스를 생성합니다. 또한 items 배열의 객체 내에서 동적으로 인덱싱할 수 있는 모든 필드를 자동으로 인덱싱하도록 Atlas Search를 구성합니다.

  1. Add Field Mapping 창의 Field Name 드롭다운에서 items 을 선택합니다.

  2. Data Type 드롭다운을 클릭하여 EmbeddedDocuments를 선택합니다.

  3. 필요한 경우 Enable Dynamic Mapping 을 토글하여 동적 매핑을 활성화하도록 설정합니다.

  4. 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}

다음 인덱스 정의는 nametags 필드만 items 객체 배열에서 Atlas Search string 유형으로 인덱싱하도록 Atlas Search를 구성합니다.

  1. Add Field Mapping 창의 Field Name 드롭다운에서 items 을 선택합니다.

  2. Data Type 드롭다운을 클릭하여 EmbeddedDocuments를 선택합니다.

  3. Enable Dynamic Mapping 비활성화.

  4. Add를 클릭합니다.

  5. Field Mappings 테이블에서 items 필드에 대해 Add Embedded Field를 클릭하고, Add Embedded Field Mapping 창에서 각 필드에 대한 설정을 구성한 후 Add를 클릭하여 다음 필드를 추가합니다.

    Field Name
    Data Type
    items.name
    Data Type 드롭다운을 클릭하여 String를 선택합니다.
    items.tags
    Data 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}

추가 인덱스 정의에 대한 예시도 참조하세요.

돌아가기

문서