97

同じデータベース内でコレクションをコピーして別の名前を付けたい - 基本的にスナップショットを作成します。

これを行う最善の方法は何ですか?コマンドはありますか、それとも各レコードを順番にコピーする必要がありますか?

コマンドは認識してcloneCollectionいますが、別のサーバーへのコピー専用のようです。

と も認識しmongoimportmongoexportいますが、PHP 経由でこれを行っているため、シェルを呼び出したくないのです。

4

8 に答える 8

61

いくつかのオプションがありますが、最も速いのは次のとおりです。

mongodump -d db -c sourcecollection 
mongorestore -d db -c targetcollection --dir=dump/<db>/<sourcecollection.bson>

また

mongoexport -d db -c sourcecollection | mongoimport -d db -c targetcollection --drop

またはphpで:

`mongoexport -d db -c sourcecollection | mongoimport -d db -c targetcollection --drop`;

その後、あなたは持っています

mongo db < script.js

mongo docsに示されているように、 script.js には次のようなものが含まれています。

db.myoriginal.find().forEach( function(x){db.mycopy.insert(x)} );

コレクションをコピーする最も遅い (1 桁以上) 方法は、ネイティブの php ドライバーを使用することです。これは、単に情報を移動するためです。ただし、 db execute関数を使用した cli 呼び出しを絶対に避けたい場合は、上記の mongo クエリを発行できます。

于 2012-05-16T21:36:29.913 に答える
16

注:回答の更新を読んでください。重要です!


最もシンプルで効率的な方法は、copyTo()を使用することです。したがって、次を使用できます。

db.source.copyTo("target"); 

&"target"存在しない場合は作成されます

- アップデート -

CopyTo Documentationによると、内部で eval を使用しているためcopyTo()、コピー操作は mongod インスタンスでの他のすべての操作をブロックします。したがって、本番環境では使用しないでください。

- アップデート -

バージョン 3.0 以降、内部でCopyTo()使用&が非推奨になっているため、バージョン 3.0以降も非推奨ですeval()eval()CopyTo()

于 2014-01-19T17:42:27.133 に答える
3

最初のオプション (mongo dump を使用)

  1. コレクションからダンプを取得する

    mongodump -d db -c source_collection

  2. コレクションから復元

    mongorestore -d db -c target_collection dir=dump/db_name/source_collection.bson

2 番目のオプション

  1. 積算集計

    db.getCollection('source_collection').aggregate([ { $match: {"emailAddress" : "apitester@mailinator.com"} }, { $out: "target_collection" } ])

3 番目のオプション (最も遅い)

  1. for ループの実行

    db.getCollection('source_collection').find().forEach(function(docs){ db.getCollection('target_collection').insert(docs); }) print("ロールバック完了!");

于 2020-02-10T09:29:30.130 に答える
-3

mongo シェルで copyDatabase 関数を使用できます。

http://docs.mongodb.org/manual/tutorial/copy-databases-between-instances/

于 2013-11-10T09:32:08.577 に答える