Docs Menu
Docs Home
/
MongoDB Atlas
/ / / /

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

項目一覧

  • 構文
  • 動作
  • サンプル使用

コレクションの インデックス定義 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オプションを使用して、次のアクションを実行できます。

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

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

重要

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

このセクションの例では、 sample_mflix.moviesコレクションを使用します。 例は、Atlas 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]

戻る

6 。 検索タームの追跡