Docs Menu
Docs Home
/ /

保存されたソースフィールドを返す

コレクションのインデックス定義で storedSource オプションを構成した場合、 MongoDB Search は指定されたフィールドをmongot に保存します。MongoDB Search クエリで returnStoredSourceブール値オプションを使用すると、コレクションから完全なドキュメントを取得するのではなく、それらのフィールドのみを取得できます。

デフォルトでは 、 MongoDB Search は、 MongoDB Search がクエリのドキュメントを照合した後、バックエンドデータベースで暗黙的に完全なドキュメント検索を実行します。このルックアップは、$search ステージから一致したデータセットをすべて取得する後続の集計パイプラインステージ ($sort$group など)、またはその大部分をフィルタリングすることで、パフォーマンスを大幅に低下させる可能性があります($match$skip)。storedSource オプションを構成した場合、 returnStoredSource オプションを使用すると、 MongoDB Search に直接保存されているドキュメントの一部のみが検索され、データベースでのドキュメント全体の検索を回避できます。これにより、最小限のフィールド数を持つドキュメントに対してほとんどのデータベース側のフィルタリング操作を実行できます。その後、$lookup を使用して、パイプラインの後半のステージでドキュメントからすべてのフィールドを検索できます。

注意

  • returnStoredSource は、 MongoDB 7.0 以降を実行中クラスターでのみ使用できます。

  • シャーディングされたコレクションの場合、$lookup はMongoDB 5.1 以降を実行中クラスターでのみ使用できます。

returnStoredSource クエリでは、次の構文を使用します。

{
$search: {
"<operator>": {
<operator-specification>
},
"returnStoredSource": true | false // optional, defaults to "false"
}
}

クエリ構文の詳細については、 $searchを参照してください。

returnStoredSourceブール値オプションは、 MongoDB Search がデータベースに対して完全なドキュメント検索を実行するか、 MongoDB Search から保存されたフィールドを直接返す必要があるかを指定します。returnStoredSource オプションは、インデックス定義にMongoDB Search にフィールドを保存するための構成が含まれている場合にのみ使用できます。MongoDB Search にフィールドを保存する方法の詳細については、インデックス リファレンス および MongoDB Search インデックスに保存されているソース フィールドの定義 を参照してください。

returnStoredSourceオプションには、次のいずれかの値を設定できます。

  • true - 保存されたソース フィールドのみをMongoDB Search から直接返す

  • false - バックエンド データベースで暗黙的な完全なドキュメント検索を実行します(デフォルト)

returnStoredSourceブール値オプションを true に設定してMongoDB Search クエリを実行すると、次のようになります。

  • MongoDB Search では、保存用に構成されたドキュメントが含まれていない場合、空のドキュメントが返されます。

  • MongoDB Search は、インデックス定義に 保存済みソース構成が含まれていない場合、エラーを返します。

  • MongoDB Search では、レプリケーションラグ が原因で古いデータが返される可能性があります。

  • MongoDB Search では、シャーディングされたクラスター上の重複データが返される場合があります。

バックエンドデータベースでコレクションに対して大量のデータ挿入およびアップデート操作を実行すると、レプリケーションラグ が原因で mongot に保存されているデータが最新ではない可能性があるため、 MongoDB Search では古いデータが返される可能性があります。MongoDB Search が のmongod oplog からの変更をレプリケートする際に遅延しているおおよそのミリ秒数を Atlas UIで確認できます。詳しくは「 MongoDB Search メトリクスの確認 」を参照してください。

チャンクの移行中に孤立したドキュメントがある場合、 MongoDB Search はシャーディングされたクラスターに対するクエリに対して重複したドキュメントを返す可能性があります。

$searchステージで多くの結果が破棄され、データベースで暗黙的なドキュメント検索を実行する必要がある場合は、 returnStoredSourceオプションを使用することをお勧めします。 並べ替えやフィルタリングに必要なフィールドを保存し、クエリ時にreturnStoredSourceオプションを使用して、次のアクションを実行できます。

  1. MongoDB Search によって返された部分的なドキュメントに対する中間操作

  2. $lookup 完全なドキュメントが必要な場合は、パイプラインの最後にある。

重要

効率を得るには、 MongoDB Search のストレージ用に最小限の数のフィールドのみを構成します。ドキュメントが大きく、検索中に問題が発生する場合は、このオプションを使用します。

このセクションの例では、 sample_mflix.moviesコレクションを使用します。例は、 MongoDB Search が $search ステージの後に返すドキュメントに対してソートまたは一致を実行し、その後データベース上のドキュメントを検索する方法を示しています。

  1. 以下のインデックス定義を使用してインデックスを作成します。 コレクションのインデックス定義では、次のフィールドを指定します。

    • インデックスtitleフィールド

    • yearフィールドとtitle フィールドを保存する

    {
    "mappings": {
    "fields": {
    "title": {
    "type": "string"
    }
    }
    },
    "storedSource": {
    "include": [
    "year",
    "title"
    ]
    }
    }
  2. コレクションに対して次のクエリを実行します。

    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]
  1. 以下のインデックス定義を使用してインデックスを作成します。 コレクションのインデックス定義では、次のフィールドを指定します。

    • インデックスtitleフィールド

    • imdb.ratingフィールドとimdb.votes フィールドを保存する

    {
    "mappings": {
    "fields": {
    "title": {
    "type": "string"
    }
    }
    },
    "storedSource": {
    "include": [
    "imdb.rating",
    "imdb.votes"
    ]
    }
    }
  2. コレクションに対して次のクエリを実行します。

    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]

戻る

同時実行

項目一覧