AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。
See how MongoDB 9.0 delivers up to 2x higher throughput.
MongoDB Branding Shape
Register now >
Docs Menu

embeddedDocument 演算子

embeddedDocument

embeddedDocument 演算子は、$elemMatch 演算子と似ています。埋め込みドキュメントの配列の単一の要素から複数のクエリ述語が満たされるように制約します。embeddedDocument は、embeddedDocuments 型のフィールドに対するクエリにのみ使用できます。

embeddedDocument の構文は次のとおりです。

{
"embeddedDocument": {
"path": "<path-to-field>",
"operator": { <operator-specification> },
"score": { <score-options> }
}
}

embeddedDocument では、次のオプションを使用してクエリを作成します。

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

operator

オブジェクト

pathで指定したドキュメントの配列内の各ドキュメントをクエリするために使用する演算子。 moreLikeThis演算子はサポートされていません。

必須

path

string

検索するためのインデックス付きのembeddedDocumentsタイプ フィールド。指定されたフィールドは、operatorオプションを使用して指定されたすべての演算子とフィールドの親である必要があります。

必須

score

オブジェクト

一致する検索結果に割り当てる スコア 。 スコアリング オプションを構成するには、 embeddedスコアリング オプションを使用します。 詳しくは、「スコアリング動作 」を参照してください。

任意

embeddedDocument演算子内のクエリではハイライトを使用することはできません。

注意

MongoDB Search は、レプリカセットまたは単一のシャードで、パーティションごとに 2、100、000、000インデックスオブジェクトを超えるインデックスの変更の複製を停止します。ここでは、インデックス付きで埋め込まれた各親ドキュメントは1 つのオブジェクトとしてカウントされます。この制限を超えると、古いクエリ結果が発生する可能性があります。

embeddedDocuments フィールド タイプを使用すると、インデックス化された各埋め込みドキュメントが 1 つのオブジェクトとしてカウントされるため、このインデックス サイズ制限を超えるオブジェクトのインデックス化が行われる可能性があります。2.1 億以上のインデックス オブジェクトを持つ、または近く持つ予定のMongoDB Search インデックスを作成する場合は、numPartitions インデックス オプションを使用してインデックスをパーティション分割するか(検索ノード配置のみサポート)、またはクラスターをシャーディングします。

embeddedDocument 演算子を使用して配列内の埋め込みドキュメントをクエリすると、 MongoDB Search はクエリ実行のさまざまな段階で 演算子クエリ述語を評価し、スコアを付けます。MongoDB Search:

  1. 配列内の各埋め込みドキュメントを個別に評価します。

  2. embeddedオプションを使用して設定された一致結果のスコアを組み合わせます。または、 embeddedスコア オプションを指定しない場合は、一致結果のスコアを合計したスコアを組み合わせます。

  3. 他のクエリ述語が compound を通じて指定されている場合は、該当する一致結果を親ドキュメントと結合します。

デフォルトでは、 embeddedDocument演算子は、埋め込みドキュメント一致のスコアを結合するためにデフォルトの集計戦略sumを使用します。 embeddedDocument演算子scoreオプションを使用すると、デフォルトを上書きし、 embeddedオプションを使用して一致する結果のスコアを構成できます。

埋め込まれたドキュメント フィールドで親ドキュメントをソートするには、次の操作を行う必要があります。

  • 埋め込まれたドキュメント子フィールドの親をドキュメントタイプとしてインデックス化します。

  • 埋め込みドキュメント内のstring値を持つ子フィールドをトークンタイプとしてインデックスします。 数値値と日付値を持つ子フィールドの場合は、動的マッピングを有効にして、それらのフィールドを自動的にインデックス化します。

MongoDB Search は親ドキュメントのみをソートします。ドキュメントの配列内の子フィールドはソートされません。の例については、「 ソートの例 」を参照してください。

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

1db.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フィールドのファセット情報をリクエストします。

1db.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

1db.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ステージの集計演算子を使用して一致する埋め込みドキュメントのみを返します。具体的には、このクエリは次のパイプラインステージを指定します。

複合演算子 must 句に次の条件を指定します。

  • コレクションにitems.priceフィールドが存在するかどうかを確認します。

  • items.tagsフィールドでschoolとタグ付けされたアイテムを検索します。

  • items.quantityフィールドの値が2を超える場合にのみ一致します。

出力を5ドキュメントに制限します。

次のアクションを実行します。

  • フィールドを除外し、 _idフィールドと フィールドのみを含めます。itemsstoreLocation

  • $filterを使用して、 $and演算子を使用して指定された条件に一致するitems入力配列の要素のみを返します。 and演算子は、次の演算子を使用します。

    • $ifNullは、 items.priceに null 値が含まれているかどうかを判断し、null 値が存在する場合は置換式falseに置き換えます。

    • $gt 数量が2より大きいかどうかを確認します。

    • $inは、 officeがtags配列に存在するかどうかを確認します。

1db.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 クエリを実行する方法」を参照してください。