Docs Menu
Docs Home
/
MongoDB Atlas
/ / / /

オブジェクトとドキュメントの配列のフィールドにインデックスを付ける方法

項目一覧

  • embeddedDocuments 型の制限を確認する
  • 2 、 100 、 000 、 000インデックス オブジェクトの制限
  • Atlas Search の制限
  • embeddedDocument 型のインデックスを定義する
  • embeddedDocumentフィールド プロパティを構成する
  • embeddedDocument 型の例を試す

注意

Atlas Search embeddedDocuments 型、 embeddedDocument 演算子、embedded スコアリング オプションはプレビュー段階です。レプリカセットまたは単一のMongoDBシャードの Atlas Searchインデックスが2 、100 、000 、000 インデックスオブジェクトに達すると、Atlas Search はインデックスを古く、クエリ可能な状態に移行します。 Atlas Search2 100が将来、 、000 、 、000 を超えるインデックスオブジェクトをサポートしたい場合は、 MongoDBフィードバック エンジンでこのリクエストに投票してください。

Atlas Search embeddedDocumentsタイプを使用して、配列の要素であるドキュメントやオブジェクト内のフィールドをインデックス化できます。 Atlas Search は、親ドキュメントとは独立した埋め込みドキュメントをインデックス化します。 インデックス作成された各ドキュメントには、埋め込みドキュメント配列要素の一部であるフィールドのみが含まれます。 embeddedDocuments型としてインデックス付けされたフィールドをクエリするには、 embeddedDocument演算子のみを使用できます。

注意

embeddedDocumentsタイプを使用してドキュメントの配列内のフィールドをインデックス化し、ネストされた各ドキュメントを個別にクエリできるようにします。 親ドキュメントに関連するネストされたドキュメントのみをクエリする必要がある場合は、 オブジェクトとドキュメントのフィールドにインデックスを作成する方法タイプを使用します。

Atlas Search は、 embeddedDocumentタイプのフィールドを動的にインデックスしません。 フィールドのインデックスを作成するには、 静的マッピング を使用する 必要 があります。embeddedDocumentAtlas UI のビジュアル エディターまたはJSON エディターを使用して、 embeddedDocument型のフィールドをインデックスできます。

embeddedDocumentsタイプを使用するインデックスを作成する前に、 2 、 100 、 000 、 000インデックス オブジェクトの制限 とその他の Atlas Search の制限 を確認してください。

Atlas Search2 100000000は、レプリカセットまたは単一のシャードで、パーティションごとに 、 、 インデックスオブジェクトを超えるインデックスの変更の複製を停止します。ここでは、インデックス作成された各埋め込みドキュメントは 1 つのオブジェクトとしてカウントされます。embeddedDocuments Staleフィールド型を使用すると、この制限を超えるオブジェクトのインデックスが作成される可能性があり、そのためインデックスが クエリ可能な状態に移行し、古い結果が生じる可能性があります。インデックスオブジェクトが2.1 億を超えるコレクションに対して Atlas Searchインデックスを作成する場合は、numPartitions オプションを使用するか、クラスターをシャーディングする必要があります。

インデックス オブジェクトの正確な数は、ドキュメントの変更と削除の速度によって異なる可能性があります。 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タイプのインデックスを含むクラスターをシャードする必要があります。

次の制限が適用されます。

  • embeddedDocumentsは、ネストが最大5レベルを持つフィールドでのみ使用できます。 embeddedDocumentsフィールドには、 4より多くの親embeddedDocumentsフィールドを含めることはできません。

  • 日付または数値ファセットにはembeddedDocumentsは使用できません。

  • 非推奨の knnVector 型として embeddedDocuments 型の内部にフィールドを定義することはできません。

  • 埋め込まれたドキュメント内のフィールドを強調表示するには、強調表示するフィールドの親もドキュメント型として強調表示する必要があります。

  • 次の操作は、埋め込みドキュメント子フィールドの親をドキュメントタイプとしてインデックスする場合にのみ可能です。

    • 埋め込みドキュメント内の stringフィールドを ファセット検索 します。また、ファセットするフィールドをstringFacet型としてインデックスする必要があります。

      注意

      埋め込まれたドキュメント内の文字列フィールドをファセットすると、Atlas Search は一致する親ドキュメントの数のみのファセット数を返します。

      埋め込みドキュメント内の数値フィールドと日付フィールドをファセットすることはできません。

    • 埋め込みドキュメント内のフィールドを強調表示します。 例については、 「 配列内のオブジェクトに対して Atlas Search クエリを実行する方法 」チュートリアルを参照してください。

    • 埋め込みドキュメント フィールドの親でソートします。 また、string トークン タイプとして 値を持つ埋め込みドキュメントフィールドもインデックスする必要があります。数値値と日付値を持つ子フィールドの場合は、 動的マッピング を有効にして、それらのフィールドを自動的にインデックス化します。 例については、「ソートの例 」を参照してください。

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型は次のパラメータを取ります。

フィールド
タイプ
必要性
説明
default

type

string

必須

フィールド型を識別する、人間が判読できるラベル。 値はembeddedDocumentsである必要があります。

dynamic

ブール値

任意

ドキュメント内のすべての動的にインデックス付け可能なフィールドにインデックスを付けるかどうかを指定するフラグ。 値は次のいずれかになります。

  • true - すべてのインデックス作成可能なフィールドにインデックスを付ける。

  • false - インデックス可能なフィールドはすべてインデックスを作成しないでください。

false

fields

ドキュメント

任意

インデックスを作成するフィールド。

dynamictrueの場合、Atlas Search はすべてのインデックス作成可能なフィールドにインデックスを作成します。

dynamicfalseの場合、 fieldsのフィールド定義でインデックスするフィールドを指定できます。

Atlas Search では、 embeddedDocumentsフィールドの一部としてファセット フィールドのインデックスを作成することはできません。

{}

次のインデックス定義の例では、 sample_issue.salesコレクションを使用しています。 サンプル データがすでにクラスターにロードされている場合は、Atlas UI のビジュアル エディターまたはJSONエディターを使用してインデックスを構成できます。 ご希望の構成方法を選択したら、データベースとコレクションを選択し、インデックスを微調整してフィールド マッピングを追加します。

次のインデックス定義は、 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 が動的にインデックスを作成しないフィールドを含む、埋め込みドキュメント内のすべてのフィールドにインデックスを付けるには、インデックス定義でフィールドを定義します。 string ファセットの場合、Atlas Search は結果セット内の各ドキュメントに対して string ファセットを 1 回カウントします。

たとえば、次のインデックス定義は、 items配列のオブジェクト内のすべての動的にインデックス付け可能なフィールドを自動的にインデックス化するように Atlas Search を構成します。 purchaseMethodまた、そのフィールドに対するAtlas Search Atlas Searchファセット クエリをサポートするように、 は動的にインデックスを作成しない stringFacet としてインデックス付けされるようにオブジェクトの配列内の フィールドを構成します。

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}

次のインデックス定義では、オブジェクトの 配列内でname フィールドとtags フィールドのみを Atlas Searchstring タイプとしてインデックス化するように Atlas Searchitems を構成します。

  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}

Tip

その他のインデックス定義例も参照してください

戻る

ドキュメント