このページでは、$mergeパイプラインステージを使用して特定のアーカイブ データを復元する方法について説明します。このアプローチでは、特定の基準に基づいてより詳細な復元するを実行できます。完全なクラスターを復元する必要がある場合は、アーカイブ データのバックアップと復元で詳細を参照してください。
注意
アーカイブから復元するデータ量に応じて、クラスターが十分にプロビジョニングされていることを確認します。そうしないと、復元中または復元後にスペースが実行中リスクがあります。oplogのサイズ設定に関する追加の技術ガイダンスや、Atlas クラスターのスペースの問題のトラブルシューティングについては、 サポートにお問い合わせください 。
必要なアクセス権
この手順では、プロジェクトに対する Project Data Access Admin 以上のアクセス権が必要です。
Considerations
このアプローチは、多数のパーティションを持つ大規模なデータセット(約 1 TB のデータ)には推奨されません。
手順
特定のアーカイブ データを Atlas クラスターに復元するには、次の手順を実行します。
復元したいアーカイブ データを含むコレクションに関連付けられているオンライン アーカイブを一時停止します。
詳細については、「アーカイブの一時停止と再開」を参照してください。
接続文字列を使用して Atlas Online アーカイブに接続します。
Atlas Online Archive に接続するには、{0 接続 を使用する必要があります。Archive Onlystring詳細については、「 Atlas Online Archive への接続 」を参照してください。
$merge ステージを使用して、アーカイブから Atlas クラスターにデータを移動します。
Atlas クラスターにデータを移動するための$mergeパイプライン ステージの構文と使用方法の詳細については、 $mergeパイプライン ステージを参照してください。
例
S3アーカイブ内の次のドキュメントを検討してみましょう。
{ "_id" : 1, "item": "cucumber", "source": "nepal", "released": ISODate("2016-05-18T16:00:00Z") } { "_id" : 2, "item": "miso", "source": "canada", "released": ISODate("2016-05-18T16:00:00Z") } { "_id" : 3, "item": "oyster", "source": "luxembourg", "released": ISODate("2016-05-18T16:00:00Z") } { "_id" : 4, "item": "mushroom", "source": "ghana", "released": ISODate("2016-05-18T16:00:00Z") }
$merge ステージで item フィールドと source フィールドに基づいてドキュメントを復元するとします。次のコードサンプルは、$merge ステージを使用して、その条件に基づいてアーカイブ データを復元する例を示しています。
db.<collection>.aggregate([ { "$merge": { "into": { "atlas": { "clusterName": "<atlas-cluster-name>", "db": "<db-name>", "coll": "<collection-name>" } }, "on": [ "item", "source" ], "whenMatched": "keepExisting", "whenNotMatched": "insert" } } ])
このコードでは、次のロジックを使用します。
アーカイブされたドキュメントが、
itemフィールドとsourceフィールドの Atlas クラスター上のドキュメントと一致する場合、Atlas クラスター上のドキュメントのコピーがアーカイブ バージョンよりも新しいため、Atlas は既存のドキュメントをクラスターに保持します。アーカイブされたドキュメントがAtlas クラスター内のどのドキュメントとも一致しない場合、Atlas は Atlas クラスター上の指定されたコレクションにドキュメントを挿入します。
Atlas クラスターにデータを復元する場合、アーカイブされたデータに重複する _id フィールドが含まれる場合があります。この例では、$sort ステージの前に、_id および released フィールドでソートするための $merge ステージを含めることができ、解決する重複がある場合に Atlas が最新の日付を持つドキュメントを選択するようにします。
次のコードサンプルでは、 $sort ステージを追加します。
db.runCommand({ "aggregate": "<collection>", "pipeline": [ { $sort: { "_id": 1, "released": 1, } }, { "$merge": { "into": { "atlas": { "clusterName": "<atlas-cluster-name>", "db": "<db-name>", "coll": "<collection-name>" } }, "on": [ "item", "source" ], "whenMatched": "keepExisting", "whenNotMatched": "insert" } } ], "cursor": { } }, { "background": true } )
重複フィールドの解決の詳細については、 $merge に関する考慮事項 を参照してください。
注意
複数のonフィールドがある場合は、 on識別子フィールドに複合一意のインデックスを作成する必要があります。
db.<collection>.createIndex( { item: 1, source: 1 }, { unique: true } )
または、一時コレクションへのマージを、on 識別子フィールドごとに 1 つずつ順番に指定します。次に、クラスターの接続文字列を使用して、一時コレクションのデータをターゲットコレクションにマージします。また、on 識別子フィールドごとにユニークインデックスを作成する必要があります。
background フラグを true に設定することで、集計ステージをバックグラウンドで実行できます。mongosh でこのコマンドを実行するには、db.runCommand を使用します。
Atlas クラスター内のデータを確認し、オンライン アーカイブを削除します。
詳細については、「 Atlas Online Archive の削除」を参照してください。
注意
Atlas クラスターへのデータの移行中に問題が発生した場合は、サポート にお問い合わせください。