HOWTO · MongoDB

MongoDB の同じデータベース内のコレクションをコピーする

このチュートリアルでは、mongodump、monogrestore、aggregate 関数、および forEach ループを使用して同じデータベース内のコレクションをコピーする方法を示します。

このページの内容

同じデータベース内のコレクションをコピーするのは素晴らしい作業です。時間と労力を節約できます。このチュートリアルでは、mongodump、mongorestore、aggregate()、および forEach() を使用して、MongoDB を使用して同じデータベース内のコレクションをコピーする方法を示します。

MongoDB での作業中に、同じデータベース内のコレクションをコピーする

古いバージョンの MongoDB、たとえば 3.0 未満では、copyTo() メソッドを db.collection_name.copyTo() として使用してコレクションをコピーできましたが、現在は非推奨です。

eval も MongoDB バージョン 4.2 の開始に伴い廃止されました。db.collection_name.copyTo() は eval をラップすることに注意してください。つまり、MongoDB バージョン 4.2 以降を使用している場合、どちらかを使用してコレクションをコピーすることはできません。

MongoDB の新しいバージョンには、同じデータベース内のコレクションをコピーするために使用できる他のいくつかの方法があります。それらのいくつかをここに示します。

  1. mongodump および mongorestore コマンドを使用します
  2. aggregate() メソッドを使用します
  3. forEach() ループを使用します

それぞれを一つずつ学び始めましょう。

mongodump と mongorestore を使用して、MongoDB の同じデータベース内のコレクションをコピーする

これは、MongoDB データベースツールを使用して同じデータベース内のコレクションを複製/コピーするための最速の方法です。特に、mongodump と mongorestore を使用できます。データベースツールは、MongoDB で作業するための一連のコマンドラインユーティリティです。

Windows コマンドプロンプトで次のコマンドを使用して、mongodump と mongorestore のバージョンを確認できます。それぞれのバージョンが正常に返されると、データベースツールがインストールされます。

それ以外の場合は、ここに従ってデータベースツールをインストールします。

サンプルコード:

C:/Users/Dell> mongodump --version

サンプルコード:

C:/Users/Dell> mongorestore --version

システムのコマンドラインから mongodump および mongorestore コマンドを実行する必要があることを忘れないでください。たとえば、Ubuntu を使用している場合は、WindowsOS またはターミナルからのコマンドプロンプトです。このコマンドを mongo シェルから実行しないでください。

MongoDBで作業するためのデータベースツールを入手したら、同じデータベース内の teachers コレクションをダンプするために、以下のコマンドを実行してください: test.

サンプルコード:

C:/Users/Dell> mongodump -d test -c teachers

出力:

2022-05-27T13:05:14.497+0500    writing test.teachers to dump\test\teachers.bson
2022-05-27T13:05:14.503+0500    done dumping test.teachers (3 documents)

上記の出力は、ダンプファイルが dump\test\teachers.bson に書き込まれていることを示しています。したがって、以下のコマンドを使用して復元する必要があります。

サンプルコード:

C:/Users/Dell>mongorestore -d test -c teachers1 --dir=dump/<db>/<sourcecollection.bson>

出力:

2022-05-27T13:05:28.085+0500    checking for collection data in dump\test\teachers.bson
2022-05-27T13:05:28.088+0500    reading metadata for test.teachers1 from dump\test\teachers.metadata.json
2022-05-27T13:05:28.252+0500    restoring test.teachers1 from dump\test\teachers.bson
2022-05-27T13:05:28.312+0500    finished restoring test.teachers1 (3 documents, 0 failures)
2022-05-27T13:05:28.312+0500    no indexes to restore for collection test.teachers1
2022-05-27T13:05:28.313+0500    3 document(s) restored successfully. 0 document(s) failed to restore.

出力は上記のようになります。これは、コレクションが正常にコピーされたことを意味します。teachers1 という名前のターゲットコレクションは、現在のデータベースに存在しない場合に作成されます。

次に、mongo シェルを開き、次のクエリを実行して、コピーされたコレクションがそこにあるかどうかを確認します。

サンプルコード:

> show collections

出力:

teachers
teachers1

または、mongoexport を使用してコレクション(teachers)をデータベース(test)からエクスポートし、mongoimport を使用して同じデータベース内の teachers2 コレクションにインポートすることもできます。

サンプルコード:

C:/Users/Dell> mongoexport -d test -c teachers | mongoimport -d test -c teachers2 --drop

aggregate() メソッドを使用して、MongoDB の同じデータベース内のコレクションをコピーする

サンプルコード:

> db.teachers.aggregate([{$out: "teachers3"}])

このコマンドは、mongo シェルを使用して実行されます。その後、show collections コマンドを使用して teachers3 が存在するかどうかを確認します。

サンプルコード:

> show collections

出力:

teachers
teachers1
teachers2
teachers3

teachers コレクションからデータを返し、指定されたコレクション(ここでは teachers3)に書き込む集約パイプラインを使用しています。MongoDB バージョン 4.4 以降を使用している場合は、このアプローチを使用できます。

forEach() ループを使用して、MongoDB の同じデータベース内のコレクションをコピーする

サンプルコード:

> db.teachers.find().forEach((doc) => {
    db.teachers4.insert(doc)
  })

次のクエリを使用して、teachers4 が同じデータベース内にあることを確認します。

サンプルコード:

> show collections

出力:

teachers
teachers1
teachers2
teachers3
teachers4

この方法は、ループを使用するため、上記のすべてのアプローチに比べて最も時間がかかります。ソースコレクションのすべてのドキュメントを繰り返し処理し、それらを 1つずつターゲットコレクションに挿入します。