定義
embeddedDocumentembeddedDocument演算子は、$elemMatch演算子と似ています。埋め込みドキュメントの配列の単一の要素から複数のクエリ述語が満たされるように制約します。embeddedDocumentは、embeddedDocuments 型のフィールドに対するクエリにのみ使用できます。
構文
embeddedDocument の構文は次のとおりです。
{ "embeddedDocument": { "path": "<path-to-field>", "operator": { <operator-specification> }, "score": { <score-options> } } }
オプション
embeddedDocument では、次のオプションを使用してクエリを作成します。
フィールド | タイプ | 説明 | 必要性 |
|---|---|---|---|
| オブジェクト |
| 必須 |
| string | 検索するためのインデックス付きのembeddedDocumentsタイプ フィールド。指定されたフィールドは、 | 必須 |
| オブジェクト | 一致する検索結果に割り当てる スコア 。 スコアリング オプションを構成するには、 | 任意 |
embeddedDocument 演算子の制限
embeddedDocument演算子内のクエリではハイライトを使用することはできません。
注意
MongoDB Search は、レプリカセットまたは単一のシャードで、パーティションごとに 2、100、000、000インデックスオブジェクトを超えるインデックスの変更の複製を停止します。ここでは、インデックス付きで埋め込まれた各親ドキュメントは1 つのオブジェクトとしてカウントされます。この制限を超えると、古いクエリ結果が発生する可能性があります。
embeddedDocuments フィールド タイプを使用すると、インデックス化された各埋め込みドキュメントが 1 つのオブジェクトとしてカウントされるため、このインデックス サイズ制限を超えるオブジェクトのインデックス化が行われる可能性があります。2.1 億以上のインデックス オブジェクトを持つ、または近く持つ予定のMongoDB Search インデックスを作成する場合は、numPartitions インデックス オプションを使用してインデックスをパーティション分割するか(検索ノード配置のみサポート)、またはクラスターをシャーディングします。
動作
embeddedDocument 演算子を使用して配列内の埋め込みドキュメントをクエリすると、 MongoDB Search はクエリ実行のさまざまな段階で 演算子クエリ述語を評価し、スコアを付けます。MongoDB Search:
配列内の各埋め込みドキュメントを個別に評価します。
他のクエリ述語が compound を通じて指定されている場合は、該当する一致結果を親ドキュメントと結合します。
スコアリングの動作
デフォルトでは、 embeddedDocument演算子は、埋め込みドキュメント一致のスコアを結合するためにデフォルトの集計戦略sumを使用します。 embeddedDocument演算子scoreオプションを使用すると、デフォルトを上書きし、 embeddedオプションを使用して一致する結果のスコアを構成できます。
ソート動作
埋め込まれたドキュメント フィールドで親ドキュメントをソートするには、次の操作を行う必要があります。
埋め込まれたドキュメント子フィールドの親をドキュメントタイプとしてインデックス化します。
MongoDB Search は親ドキュメントのみをソートします。ドキュメントの配列内の子フィールドはソートされません。の例については、「 ソートの例 」を参照してください。
Faceting Behavior
To facet on only the child documents in an embeddedDocuments array that match your query, add a matching embeddedDocument block to the facet definition, in addition to using embeddedDocument in the query's operator. If you omit the embeddedDocument block on the facet definition, MongoDB Search facets on all child documents in the array, not just the ones that match your query. To learn more, see Facet on Matching Children of an Embedded Documents Array.
ハイライト
演算子内に指定されたクエリ述語の ドキュメント タイプの親フィールドの下にフィールドがインデックスされている場合は、オンフィールドを 強調表示 できます。embeddedDocument例については、チュートリアル を参照してください。
embeddedDocument 演算子の制限の詳細については、embeddedDocument 演算子の制限 を参照してください。
例
次の例では、サンプル データセットのsample_supplies.salesコレクションを使用します。
インデックスの定義
これらのサンプル クエリでは、 コレクションで次のインデックス定義を使用します。
{ "mappings": { "dynamic": true, "fields": { "items": [ { "dynamic": true, "type": "embeddedDocuments" }, { "dynamic": true, "fields": { "tags": { "type": "token" } }, "type": "document" } ], "purchaseMethod": { "type": "token" } } } }
基本クエリ
次のクエリは、コレクション内で school タグのアイテムを検索し、backpack という名前のアイテムを優先して検索します。MongoDB Search は、一致するすべての埋め込みドキュメントの平均(算術平均)スコアに基づいて、結果を降順でスコア付けします。クエリには、出力を 5 ドキュメントに制限する $limit ステージと、次の操作を行う $project ステージが含まれています。
items.nameフィールドとitems.tagsフィールドを除くすべてのフィールドを除外次のフィールドを追加:
score
1 db.sales.aggregate({ 2 "$search": { 3 "embeddedDocument": { 4 "path": "items", 5 "operator": { 6 "compound": { 7 "must": [{ 8 "text": { 9 "path": "items.tags", 10 "query": "school" 11 } 12 }], 13 "should": [{ 14 "text": { 15 "path": "items.name", 16 "query": "backpack" 17 } 18 }] 19 } 20 }, 21 "score": { 22 "embedded": { 23 "aggregate": "mean" 24 } 25 } 26 } 27 } 28 }, 29 { 30 $limit: 5 31 }, 32 { 33 $project: { 34 "_id": 0, 35 "items.name": 1, 36 "items.tags": 1, 37 "score": { $meta: "searchScore" } 38 } 39 })
ファセット クエリ
次のクエリは、 schoolタグのアイテムを検索し、 backpackという名前のアイテムを優先します。 purchaseMethodフィールドのファセット情報をリクエストします。
1 db.sales.aggregate({ 2 "$searchMeta": { 3 "facet": { 4 "operator": { 5 "embeddedDocument": { 6 "path": "items", 7 "operator": { 8 "compound": { 9 "must": [ 10 { 11 "text": { 12 "path": "items.tags", 13 "query": "school" 14 } 15 } 16 ], 17 "should": [ 18 { 19 "text": { 20 "path": "items.name", 21 "query": "backpack" 22 } 23 } 24 ] 25 } 26 } 27 } 28 }, 29 "facets": { 30 "purchaseMethodFacet": { 31 "type": "string", 32 "path": "purchaseMethod" 33 } 34 } 35 } 36 } 37 })
クエリとソート
次のクエリは、 laptopという名前のアイテムを検索し、その結果をitems.tagsフィールドでソートします。 クエリには、出力を5ドキュメントに制限する$limitステージと、次の操作を行う$projectステージが含まれています。
items.nameとitems.tagsを除くすべてのフィールドを除外次のフィールドを追加:
score
1 db.sales.aggregate({ 2 "$search": { 3 "embeddedDocument": { 4 "path": "items", 5 "operator": { 6 "text": { 7 "path": "items.name", 8 "query": "laptop" 9 } 10 } 11 }, 12 "sort": { 13 "items.tags": 1 14 } 15 } 16 }, 17 { 18 "$limit": 5 19 }, 20 { 21 "$project": { 22 "_id": 0, 23 "items.name": 1, 24 "items.tags": 1, 25 "score": { "$meta": "searchScore" } 26 } 27 })
埋め込みドキュメントのみに一致するクエリ
次のクエリは、クエリに一致するネストされたドキュメントのみを返します。クエリは、 ステージでMongoDB Search複合演算子句を使用して一致するドキュメントを検索し、次に $search$projectステージの集計演算子を使用して一致する埋め込みドキュメントのみを返します。具体的には、このクエリは次のパイプラインステージを指定します。
複合演算子
| |
出力を | |
1 db.sales.aggregate( 2 { 3 "$search": { 4 "embeddedDocument": { 5 "path": "items", 6 "operator": { 7 "compound": { 8 "must": [ 9 { 10 "range": { 11 "path": "items.quantity", 12 "gt": 2 13 } 14 }, 15 { 16 "exists": { 17 "path": "items.price" 18 } 19 }, 20 { 21 "text": { 22 "path": "items.tags", 23 "query": "school" 24 } 25 } 26 ] 27 } 28 } 29 } 30 } 31 }, 32 { 33 "$limit": 2 34 }, 35 { 36 "$project": { 37 "_id": 0, 38 "storeLocation": 1, 39 "items": { 40 "$filter": { 41 "input": "$items", 42 "cond": { 43 "$and": [ 44 { 45 "$ifNull": [ 46 "$$this.price", "false" 47 ] 48 }, 49 { 50 "$gt": [ 51 "$$this.quantity", 2 52 ] 53 }, 54 { 55 "$in": [ 56 "office", "$$this.tags" 57 ] 58 } 59 ] 60 } 61 } 62 } 63 } 64 } 65 )
詳細
詳細については、「埋め込みドキュメントのフィールドに対してMongoDB Search クエリを実行する方法」を参照してください。