保存されたソースフィールドを返す
コレクションの インデックス定義 で storedSource オプションを構成した場合、Atlas Search は指定されたフィールドをmongot
に保存します。Atlas Search クエリでreturnStoredSource
ブール値オプションを使用すると、コレクションから完全なドキュメントを取得するのではなく、それらのフィールドのみを取得できます。
デフォルトでは、 Atlas Search Atlas Searchクエリのドキュメントを照合した後、バックエンド データベースで暗黙的に完全なドキュメント検索を実行します。 このルックアップは、 $search
ステージから一致したデータセットをすべて取得する後続の 集計パイプライン ステージ ( $sort
、 $group
など)、またはその大部分をフィルタリングすることで、パフォーマンスを大幅に低下させる可能性があります( $match
、 $skip
)。 storedSource
オプションを構成した場合、 returnStoredSource
オプションを使用すると、Atlas Search に直接保存されているドキュメントの一部のみが検索され、 データベースでのドキュメント全体の検索を回避できます。 これにより、最小限のフィールド数を持つドキュメントに対してほとんどのデータベース側のフィルタリング操作を実行できます。 その後、 $lookup
を使用して、パイプラインの後半のステージでドキュメントからすべてのフィールドを検索できます。
注意
returnStoredSource
は、MongoDB 5.0 以降を実行している Atlas クラスターでのみ使用できます。シャーディングされたコレクションの場合、
$lookup
は MongoDB 5.1以降を実行している Atlas クラスターでのみ使用できます。
構文
returnStoredSource
クエリでは、次の構文を使用します。
{ $search: { "<operator>": { <operator-specification> }, "returnStoredSource": true | false // optional, defaults to "false" } }
クエリ構文の詳細については、 $search
を参照してください。
動作
returnStoredSource
ブール値オプションは、Atlas Search がデータベースに対して完全なドキュメント検索を実行するか、保存されたフィールドを Atlas Search から直接返す必要があるかを指定します。 Atlas Search にフィールドを保存するための構成がインデックス定義に含まれている場合にのみ、 returnStoredSource
オプションを使用できます。 Atlas Search にフィールドを保存する方法の詳細については、「 Atlas Search インデックス構文の確認 」および「 Atlas Search インデックスに保存されているソース フィールドの定義 」を参照してください。
returnStoredSource
オプションには、次のいずれかの値を設定できます。
true
- 保存されたソース フィールドのみを Atlas Search から直接返すfalse
- バックエンド データベースで暗黙的な完全なドキュメント検索を実行します(デフォルト)
returnStoredSource
ブール値 オプションをtrue
に設定して Atlas Search クエリを実行すると、次のことが起きます。
Atlas Search では、保存用に構成されたフィールドが含まれていない場合、空のドキュメントが返されます。
インデックス定義に 保存済みソース 構成が含まれていない場合、Atlas Search はエラーを返します。
レプリケーションラグにより、Atlas Search が古いデータを返す可能性があります。
Atlas Search では、シャーディングされたクラスター上の重複データが返される場合があります。
バックエンド データベースでコレクションに対して大量のデータ挿入およびアップデート操作を実行すると、レプリケーション ラグによりmongot
に保存されているデータが最新でない場合があるため、Atlas Search では古いデータが返される可能性があります。 Atlas Search が のmongod
oplog からの変更をレプリケートする際に遅延しているおおよそのミリ秒数を Atlas UI で表示できます。詳しくは、「 Atlas Search メトリクスの確認 」を参照してください。
チャンクの移行中に孤立したドキュメントがある場合、Atlas Search は、シャーディングされたクラスターに対するクエリに重複したドキュメントを返す可能性があります。
サンプル使用
$search
ステージで多くの結果が破棄され、データベースで暗黙的なドキュメント検索を実行する必要がある場合は、 returnStoredSource
オプションを使用することをお勧めします。 並べ替えやフィルタリングに必要なフィールドを保存し、クエリ時にreturnStoredSource
オプションを使用して、次のアクションを実行できます。
Atlas Search によって返された部分的なドキュメントに対する中間操作
$lookup
完全なドキュメントが必要な場合は、パイプラインの最後にある。
重要
効率性を高めるために、Atlas Search のストレージには最小限の数のフィールドのみを構成します。 ドキュメントが大きく、検索中に問題が発生する場合は、このオプションを使用します。
例
このセクションの例では、 sample_mflix.movies
コレクションを使用します。 例は、Atlas Search が$search
ステージの後に返すドキュメントに対してソートまたは一致を実行し、その後 データベース上のドキュメントを検索する方法を示しています。
以下のインデックス定義を使用してインデックスを作成します。 コレクションのインデックス定義では、次のフィールドを指定します。
インデックス
title
フィールドyear
フィールドとtitle
フィールドを保存する
{ "mappings": { "fields": { "title": { "type": "string" } } }, "storedSource": { "include": [ "year", "title" ] } } コレクションに対して次のクエリを実行します。
db.movies.aggregate([ { // search and output documents $search: { "text": { "query": "baseball", "path": "title" }, "returnStoredSource": true // return stored fields only } }, // fetch all matched dataset from $search stage and sort it { $sort: {"year": 1, "title": 1} }, // discard everything except top 10 results { $limit: 10 }, // perform full document lookup for top 10 documents only { $lookup: { from: "movies", localField: "_id", foreignField: "_id", as: "document" } } ]) このクエリでは次のドキュメントが返されます。
1 [ 2 { 3 _id: ObjectId("573a1399f29313caabced370"), 4 title: 'Mr. Baseball', 5 year: 1992, 6 document: [ 7 { ... } // full document returned by $lookup 8 ] 9 }, 10 { 11 _id: ObjectId("573a1399f29313caabcee1aa"), 12 title: 'Baseball', 13 year: 1994, 14 document: [ 15 { ... } // full document returned by $lookup 16 ] 17 } 18 ]
以下のインデックス定義を使用してインデックスを作成します。 コレクションのインデックス定義では、次のフィールドを指定します。
インデックス
title
フィールドimdb.rating
フィールドとimdb.votes
フィールドを保存する
{ "mappings": { "fields": { "title": { "type": "string" } } }, "storedSource": { "include": [ "imdb.rating", "imdb.votes" ] } } コレクションに対して次のクエリを実行します。
db.movies.aggregate([ { // search and output documents $search: { "text": { "query": "baseball", "path": "title" }, "returnStoredSource": true // return stored fields only } }, // filter dataset from $search stage using $match { $match: {$or: [ { "imdb.rating": { $gt: 8.2 } }, { "imdb.votes": { $gte: 4500 } } ]} }, // perform full document lookup for matched documents only { $lookup: { from: "movies", localField: "_id", foreignField: "_id", as: "document" } } ]) このクエリでは次のドキュメントが返されます。
1 [ 2 { 3 _id: ObjectId("573a1399f29313caabcee1aa"), 4 imdb: { rating: 9.1, votes: 2460 }, 5 document: [ 6 { ... } // full document returned by $lookup 7 ] 8 }, 9 { 10 _id: ObjectId("573a1399f29313caabced370"), 11 imdb: { rating: 5.8, votes: 7617 }, 12 document: [ 13 { ... } // full document returned by $lookup 14 ] 15 } 16 ]