重要
Flex クラスターおよびサーバーレスインスタンスで使用できない機能
Flex クラスターとサーバーレスインスタンスは現時点ではこの機能をサポートしていません。詳しくは、Atlas Flex 制限とサーバーレス インスタンスの制限を参照してください。
このページでは、 パイプラインステージを使用して特定のアーカイブ データを復元する方法について説明します。このアプローチでは、特定の基準に基づいてより詳細な復元を実行できます。完全なクラスターを復元する必要がある場合は、「$merge アーカイブ データのバックアップと復元 」で詳細を参照してください。
注意
アーカイブから復元するデータ量に応じて、クラスターが十分にプロビジョニングされていることを確認します。そうしないと、復元中または復元後にスペースが不足実行中リスクがあります。 oplogのサイズ設定に関する追加の技術ガイダンスや、Atlas クラスターのスペースの問題のトラブルシューティングについては、 サポートにお問い合わせください 。
必要なアクセス権
Project Data Access Adminこの手順では、プロジェクトに対する 以上のアクセス権が必要です。
Considerations
このアプローチは、多数のパーティションを持つ大規模なデータセット(約 1 TB のデータ)には推奨されません。
手順
特定のアーカイブ データを Atlas クラスターに復元するには、次の手順を実行します。
復元したいアーカイブ データを含むコレクションに関連付けられている Atlas Online アーカイブ を一時停止します。
詳細については、「アーカイブの一時停止と再開」を参照してください。
接続文字列を使用して 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 クラスターへのデータの移行中に問題が発生した場合は、サポート にお問い合わせください。