オブジェクトとドキュメントの配列のフィールドにインデックスを付ける方法
項目一覧
注意
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演算子のみを使用できます。
オブジェクトの配列内の日付フィールド、数値フィールド、および文字列フィールドをファセットできます。これらのフィールドをファセットと、Atlas Search は一致するルート ドキュメントの数に基づいてファセット数を返します。
注意
embeddedDocuments
タイプを使用してドキュメントの配列内のフィールドをインデックス化し、ネストされた各ドキュメントを個別にクエリできるようにします。 親ドキュメントに関連するネストされたドキュメントのみをクエリする必要がある場合は、 オブジェクトとドキュメントのフィールドにインデックスを作成する方法タイプを使用します。
Atlas Search は、 embeddedDocument
タイプのフィールドを動的にインデックスしません。 フィールドのインデックスを作成するには、 静的マッピング を使用する 必要 があります。embeddedDocument
Atlas UI のビジュアル エディターまたはJSON エディターを使用して、 embeddedDocument
型のフィールドをインデックスできます。
embeddedDocuments
型の制限を確認する
embeddedDocuments
タイプを使用するインデックスを作成する前に、 2 、 100 、 000 、 000インデックス オブジェクトの制限 とその他の Atlas Search の制限 を確認してください。
2 、 100 、 000 、 000インデックス オブジェクトの制限
Atlas Search は、レプリカセットまたは単一のシャードで、パーティションごとに 2、100、000、000インデックスオブジェクトを超えるインデックスの変更の複製を停止します。ここでは、インデックス作成された各埋め込みドキュメントは1 つのオブジェクトとしてカウントされます。 embeddedDocuments
フィールド型を使用すると、この制限を超えるオブジェクトのインデックスが作成される可能性があり、そのためインデックスがStale
クエリ可能な状態に移行し、古い結果が生じる可能性があります。 インデックスオブジェクトが2.1 億を超えるコレクションに対して Atlas Searchインデックスを作成する場合は、numPartitions
オプションを使用するか、クラスターをシャーディングする必要があります。
インデックス オブジェクトの正確な数は、ドキュメントの変更と削除の速度によって異なる可能性があります。 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
コレクションに、 2 、 100 、 000 、 000インデックス オブジェクトを生成する可能性のある大きな配列がある場合は、 embeddedDocuments
タイプのインデックスを含むクラスターをシャードする必要があります。
Atlas Search の制限
次の制限が適用されます。
embeddedDocuments
は、ネストが最大5
レベルを持つフィールドでのみ使用できます。embeddedDocuments
フィールドには、4
より多くの親embeddedDocuments
フィールドを含めることはできません。非推奨の knnVector 型として
embeddedDocuments
型の内部にフィールドを定義することはできません。埋め込まれたドキュメント内のフィールドを強調表示するには、強調表示するフィールドの親もドキュメント型として強調表示する必要があります。
次の操作は、埋め込みドキュメント子フィールドの親をドキュメントタイプとしてインデックスする場合にのみ可能です。
埋め込みドキュメント内の stringフィールドを ファセット検索 します。また、ファセットするフィールドをstringFacet型としてインデックスする必要があります。
注意
埋め込まれたドキュメント内の文字列フィールドをファセットすると、Atlas Search は一致する親ドキュメントの数のみのファセット数を返します。
埋め込みドキュメント内の数値フィールドと日付フィールドをファセットすることはできません。
埋め込みドキュメント内のフィールドを強調表示します。 例については、 「 配列内のオブジェクトに対して Atlas Search クエリを実行する方法 」チュートリアルを参照してください。
埋め込みドキュメント フィールドの親でソートします。 また、string トークン タイプとして 値を持つ埋め込みドキュメントフィールドもインデックスする必要があります。数値値と日付値を持つ子フィールドの場合は、 動的マッピング を有効にして、それらのフィールドを自動的にインデックス化します。 例については、「ソートの例 」を参照してください。
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
型は次のパラメータを取ります。
フィールド | タイプ | 必要性 | 説明 | default |
---|---|---|---|---|
| string | 必須 | フィールド型を識別する、人間が判読できるラベル。 値は | |
| ブール値 | 任意 | ドキュメント内のすべての動的にインデックス付け可能なフィールドにインデックスを付けるかどうかを指定するフラグ。 値は次のいずれかになります。
|
|
| ドキュメント | 任意 | インデックスを作成するフィールド。
Atlas Search では、 |
|
embeddedDocument
型の例を試す
次のインデックス定義の例では、 sample_issue.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 が動的にインデックスを作成しないフィールドを含む、埋め込みドキュメント内のすべてのフィールドにインデックスを付けるには、インデックス定義でフィールドを定義します。 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 |
---|---|
| [] ドロップダウンをクリックし、 |
| [] ドロップダウンをクリックし、 |
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
を構成します。
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.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 }
その他のインデックス定義例も参照してください