注意
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演算子のみを使用できます。
オブジェクトの配列内の日付フィールド、数値フィールド、および string フィールドに対してファセットを作成できます。これらのフィールドでファセットを作成すると、Atlas Search は一致するルート ドキュメントの数に基づいてファセット数を返します。
注意
embeddedDocuments
タイプを使用してドキュメント配列内のフィールドにインデックスを作成して、ネストされた各ドキュメントに個別にクエリを実行できるようにします。クエリを実行する必要があるのが、ネストされたドキュメントのうち親ドキュメントに関連するもののみである場合は、ドキュメントタイプを使用します。
Atlas Search は、 embeddedDocument
タイプのフィールドを動的にインデックスしません。 フィールドのインデックスを作成するには、 静的マッピング を使用する 必要 があります。embeddedDocument
Atlas UI のビジュアル エディターまたはJSON エディターを使用して、 embeddedDocument
型のフィールドをインデックスできます。
embeddedDocuments
型の制限
embeddedDocument
タイプでインデックスを作成する場合、次の制限が適用されます。
embeddedDocuments
は、ネストが最大5
レベルを持つフィールドでのみ使用できます。embeddedDocuments
フィールドには、4
より多くの親embeddedDocuments
フィールドを含めることはできません。非推奨の knnVector 型として
embeddedDocuments
型の内部にフィールドを定義することはできません。埋め込まれたドキュメント内のフィールドを強調表示するには、強調表示するフィールドの親もドキュメント型として強調表示する必要があります。
次の操作は、埋め込みドキュメント子フィールドの親をドキュメントタイプとしてインデックスする場合にのみ可能です。
埋め込みドキュメント内の文字列フィールドをファセット検索します。また、ファセットするフィールドを トークン 型 としてインデックス必要があります。
埋め込まれたドキュメント内の文字列フィールドをファセットすると、Atlas Search は一致する親ドキュメントの数のみのファセット数を返します。
埋め込みドキュメント内の数値フィールドと日付フィールドをファセットすることはできません。
埋め込みドキュメント内のフィールドをハイライトします。チュートリアル「埋め込みドキュメントのフィールドに対して Atlas Search クエリを実行する方法」の例を参照してください。
埋め込みドキュメント フィールドの親でソートします。 また、string トークン タイプとして 値を持つ埋め込みドキュメントフィールドもインデックスする必要があります。数値値と日付値を持つ子フィールドの場合は、 動的マッピング を有効にして、それらのフィールドを自動的にインデックス化します。 例については、「ソートの例 」を参照してください。
2 、 100 、 000 、 000インデックス オブジェクトの制限
Atlas Search は、レプリカセットまたは単一のシャードで、インデックス オブジェクトが 2,100,000,000 を超えるインデックスの変更のレプリケーションを停止します。この場合、インデックス作成された埋め込み親ドキュメントは 1 つのオブジェクトとしてカウントされます。この制限を超えると、インデックスの状態は stale
なクエリ可能に移行し、クエリ結果が古くなる可能性があります。
embeddedDocuments
フィールド タイプを使用すると、このインデックス サイズ制限を超えるオブジェクトのインデックスが作成される可能性があります。インデックス化された各埋め込みドキュメントが 1 つのオブジェクトとしてカウントされるためです。インデックス オブジェクトが 21 億を超えるコレクションに Atlas Search インデックスを作成する場合、クラスターをシャーディングする必要があります。
インデックス オブジェクトの正確な数は、ドキュメントの変更と削除の速度によって異なる可能性があります。 Lucene Docs の検索最大数メトリクスは、レプリカセットまたはシャードごとのすべてのインデックスにわたるインデックス オブジェクトの現在の数の上限を提供します。 次の手順を実行することで、単一のインデックス内のインデックス オブジェクトの予想数を概算できます。
ドキュメントあたりのインデックス オブジェクトの数を計算します。 ネストの各レベルで、各埋め込みドキュメントは個別のインデックス オブジェクトとしてカウントされます。
number of index objects in document = 1 + number of nested embedded documents ドキュメントあたりのインデックス オブジェクト数に、コレクション内のドキュメントの総数を掛けます
total number of index objects = number of index objects in document 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
タイプのインデックスを含むクラスターをシャードする必要があります。
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 Searchfacet
コレクター クエリをサポートするために、Atlas Search は を動的にインデックスしない トークン としてインデックス付けされるようにオブジェクトの配列内の フィールドを構成します。
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": "token" 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 }
詳細
embeddedDocument
演算子の詳細やクエリの例については、「embeddedDocument」を参照してください。
埋め込みドキュメントをクエリする方法については、埋め込みドキュメントのフィールドに対して Atlas Search クエリを実行する方法チュートリアルを参照してください。