AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。

compound 演算子

compound

compound 演算子は、2 つ以上の演算子を 1 つのクエリに結合します。compound クエリの各要素は句と呼ばれ、各句は 1 つ以上のサブクエリで構成されます。MongoDB Search には、 ガイダンス付きのサンプル複合クエリ テンプレートが用意されています。

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

{ $search: { "index": <index name>, // optional, defaults to "default" "compound": { <must | mustNot | should | filter>: [ { <clauses> } ], "score": <options>, "doesNotAffect": "<facet-to-exclude>" | [<array-of-facets>] } }}

それぞれの must、mustNot、should、および filter 句には、サブ句の配列が含まれています。配列にサブ句が 1 つしか含まれていない場合でも、配列構文を使用します。このページの例を参照してください。

compound では、次の用語を使用してクエリを作成します。

must

ドキュメントが結果に含まれるために一致する必要がある句。返されるスコアは、句内のすべてのサブクエリのスコアの合計です。

AND ブール値演算子にマップされます。

mustNot

ドキュメントが結果に含まれるためには、一致してはならない句。mustNot 句は返されたドキュメントのスコアに貢献しません。

AND NOT ブール値演算子にマップされます。

should

結果に含まれるドキュメントの中で、一致させたい句。should 句への一致を含むドキュメントは、should 句を含まないドキュメントよりもスコアが高くなります。返されるスコアは、句内のすべてのサブクエリのスコアの合計です。

should 句を複数使用する場合は、minimumShouldMatch オプションを使用して、結果にドキュメントを含めるために一致する必要がある should 句の最小数を指定できます。minimumShouldMatch の値は、クエリ内の should 句の数以下である必要があります。省略した場合、minimumShouldMatch オプションはデフォルトで 0 となります。

例 を参照してください。

OR ブール値演算子にマップされます。

複合クエリ内で should 句のみを使用する場合、compound 演算子は should 句クエリの配列を論理 OR として扱います。MongoDB Search では、結果を返すために、少なくとも 1 つの should 条件に一致することが必要です。minimumShouldMatch オプションを 0 に設定して、複数の should 句の条件を指定すると、 MongoDB Search は minimumShouldMatch を 1 に設定されたものとして扱い、結果を返すには少なくとも 1 つの条件に一致する必要があります。

filter

ドキュメントが結果に含まれるために、すべて一致しなければならない句。filter 句は返されたドキュメントのスコアに貢献しません。

たとえば、 compound演算子filterオプションを使用して、 $matchステージを$searchステージに置き換えることができます。 次の$matchステージでは、フィールドroleに特定の値を持つドキュメントをフィルタリングします。

$match: { "role": { "$in": [ "CLIENT", "PROFESSIONAL" ] }}

代わりに、 compound演算子filterオプションを使用できます。

$search: { "compound": { "filter": [{ "in": { "path": "role", "value": [ "CLIENT", "PROFESSIONAL" ] } }] }}

別のフィルターの例を参照してください。

score

compound 句全体のスコアを変更します。score を使用すると、スコアをブースト、置換、または変更できます。score を指定しない場合に返されるスコアは、一致を生成した must 句と should 句のすべてのサブクエリのスコアの合計です。詳しくは、「スコアリング動作」を参照してください。

doesNotAffect

このクエリに基づいてカウントの再計算から除外するファセットまたはファセットのリスト。値は、$search.facets または $searchMeta.facets で定義されたファセットの 1 つ以上の名前である必要があります。演算子は、指定されたファセットを使用してこのクエリに一致するドキュメントをフィルタリングしますが、それらのカウントを再計算しません。詳細については、「 複数選択ファセット 」を参照してください。

クエリ条件の指定には、autocomplete、text、span などの任意の最上位の演算子を含む句を使用できます。

パフォーマンスを最適化するには、equals、range、in などの非スコアリング演算子を filter 句に配置して、不要なスコアリング操作を回避します。複数の操作を OR 条件として評価する必要がある場合は、最上位の filter 内に should 句をネストします。

例

[ { $search: { index: "default", compound: { filter: [ { compound: { should: [ { equals: { path: "accommodates", value: 2 } }, { range: { path: "pricePerNight", lte: 200 } } ] } } ] } } }]

MongoDB Search は、ドキュメントで一致を生成した個々の句ごとにドキュメントが受け取ったスコアを合計することで、結果セット内のドキュメントをスコアリングします。スコアリングには、must 句と should 句のみが参加します。結果セットは、スコアの高いものから低いものの順に並べられます。

次の表は、スコアに貢献するものと貢献しないものの compound 句を示しています。

句
スコアに貢献する

filter

must

mustNot

should

score オプションを使用して、複合クエリ全体のスコアをブーストまたは置換できます。複合スコア全体を置き換える例については、以下の複合スコアの例を参照してください。スコアを使用して、各句内の各サブクエリのスコアをブーストまたは変更することもできます。compound 演算子句でスコアが変更された例については、「スコアの変更」を参照してください。

次の例は、 MongoDB Search Playground または クラスターで試すことができます。

このページで サンプル クエリ を実行するには、クラスター上に fruit という名前のコレクションを作成し、次のドキュメントをコレクションに挿入します。

{ "_id" : 1, "type" : "apple", "description" : "Apples come in several varieties, including Fuji, Granny Smith, and Honeycrisp.", "category" : "nonorganic", "in_stock" : false},{ "_id" : 2, "type" : "banana", "description" : "Bananas are usually sold in bunches of five or six.", "category" : "nonorganic", "in_stock" : true},{ "_id" : 3, "type" : "pear", "description" : "Bosc and Bartlett are the most common varieties of pears.", "category" : "organic", "in_stock" : true}

このページで サンプル クエリ を実行するには、fruit サンプル コレクション 上に、次の MongoDB Search インデックスを default という名前で作成します。インデックス定義により、MongoDB Search は次の操作を実行するように構成されます。

  • デフォルトの 標準 アナライザを使用して、 コレクション内のすべてのフィールドを 動的にインデックス化 し、トークンを抽出します。fruitstandard アナライザはすべての単語を小文字にし、"the"、"a"、"and" などの一般的なストップワードを無視します。

  • type フィールドを string 型として静的にインデックス化し、text 演算子クエリと token 型をサポートして equals 演算子クエリをサポートします。

{ "mappings": { "dynamic": true, "fields": { "type": [ { "type": "string" }, { "type": "token" } ] } }}

次のクエリは、 MongoDB Search クエリの $search compound 演算子を示しています。

次の例では、must 句と mustNot 句の組み合わせを使用してクエリを構築します。must 句はテキスト演算子を使用して、description フィールド内の varieties というタームを検索します。ドキュメントが一致するには、must 句を満たす必要があります。mustNot 句は、description フィールド内の apples というタームの検索操作を実行します。ドキュメントが一致するには、mustNot 句を満たさない必要があります。

db.fruit.aggregate([ { "$search": { "compound": { "must": [{ "text": { "query": "varieties", "path": "description" } }], "mustNot": [{ "text": { "query": "apples", "path": "description" } }] } } }])

上記のクエリでは、description フィールドに varieties という単語が含まれ、apples が含まれていないため、_id: 3 を含むドキュメントが返されます。

➤ MongoDB Search Playground でこれを試してみてください。

次のクエリでは、must を使用して満たす必要のある検索条件を指定し、should を使用して Fuji という単語を含むドキュメントの優先設定を指定します。

このクエリでは、$project パイプライン ステージは _id を除くすべてのドキュメント フィールドを除外し、ドキュメントの関連性スコアを表示する score フィールドを追加します。

db.fruit.aggregate([ { "$search": { "compound": { "must": [{ "text": { "query": "varieties", "path": "description" } }], "should": [{ "text": { "query": "Fuji", "path": "description" } }] } } }, { "$project": { "score": { "$meta": "searchScore" } } }])

_id: 1 を含むドキュメントは、description フィールドに単語 Fuji が含まれており、should 句を満たしているため、スコアが高くなります。

➤ MongoDB Search Playground でこれを試してみてください。

複数の should 句を含むクエリでは、miniumumShouldMatch オプションを使用して、結果を返すために一致する必要がある句の最小数を指定できます。

次のクエリには must 句が 1 つと should 句が 2 つあり、minimumShouldMatch の値は 1 です。結果セットに含めるには、ドキュメントの description フィールドに varieties というタームが含まれている必要があり、説明フィールドに Fuji または Golden Delicious のいずれかが含まれている必要があります。

db.fruit.aggregate([ { $search: { "compound": { "must": [{ "text": { "query": "varieties", "path": "description" } }], "should": [{ "text": { "query": "Fuji", "path": "description" } }, { "text": { "query": "Golden Delicious", "path": "description" } }], "minimumShouldMatch": 1 } } }])

_id: 1 の一致を含むドキュメントは、must 句と 2 つの should 句のうちの最初の句と一致します。

➤ MongoDB Search Playground でこれを試してみてください。

filter filter 句は返されたドキュメントのスコアには考慮されないため、返されるドキュメントの順序に影響しないことを除いて must と同じように動作します。

次のクエリでは次の句を使用します。

  • must そして filter で、満たす必要のある検索条件を指定します。

  • should banana という単語を含むドキュメントを優先するように指定します。should 句には minimumShouldMatch オプションは含まれていません。minimumShouldMatch を省略すると、デフォルトは 0 となります。

db.fruit.aggregate([ { "$search": { "compound": { "must": [{ "text": { "query": "varieties", "path": "description" } }], "should": [{ "text": { "query": "banana", "path": "description" } }], "filter": [{ "text": { "query": "granny", "path": "description" } }] } } }])

返されたドキュメントは、含めるためのすべての要件を満たしています。

  • must 句と filter 句の両方が一致します。

  • minimumShouldMatch の値が指定されていないため、デフォルトで 0 になります。その結果、should 句は失敗し、ドキュメントが返されます。

➤ MongoDB Search Playground でこれを試してみてください。

次の例では、ネストされた compound 句を使用してクエリを構築します。この例では、fruit コレクションには type、 category、および in_stock のフィールドにインデックスがあり、そのテキスト フィールドではデフォルトのアナライザが使用されます。クエリでは、ドキュメントが次の should 句のいずれか 1 つだけを満たす必要があります。

  • type フィールドに apple という単語を含めます。

  • category フィールドに organic というタームが含まれ、in_stock フィールドに true という値が含まれます。

db.fruit.aggregate([ { $search: { "compound": { "should": [ { "text": { "query": "apple", "path": "type" } }, { "compound": { "must": [ { "text": { "query": "organic", "path": "category" } }, { "equals": { "value": true, "path": "in_stock" } } ] } } ], "minimumShouldMatch": 1 } } }])

結果に含まれるドキュメントは、含まれるためのすべての要件を満たしています。

  • _id: 3 のあるドキュメントは、2 番目の should 句内にネストされている must 句と一致します。

  • _id: 1 のあるドキュメントは最初の should 句に一致します。

➤ MongoDB Search Playground でこれを試してみてください。

次のクエリはメタデータを検索し、$searchMetaパイプラインステージ、または$searchステージの$$SEARCHMETA変数のいずれかを使用して、fruitコレクションのカテゴリの数を返します。

次のクエリは、結果にメタデータのみを返します。

db.fruit.aggregate([ { "$searchMeta": { "facet": { "operator": { "compound": { "must": [{ "text": { "query": "varieties", "path": "description" } }], "should": [{ "text": { "query": "Fuji", "path": "description" } }] } }, "facets": { "categoryFacet": { "type": "string", "path": "category" } } } } }])