同じデータベース内でコレクションをコピーして別の名前を付けたい - 基本的にスナップショットを作成します。
これを行う最善の方法は何ですか?コマンドはありますか、それとも各レコードを順番にコピーする必要がありますか?
コマンドは認識してcloneCollection
いますが、別のサーバーへのコピー専用のようです。
と も認識しmongoimport
てmongoexport
いますが、PHP 経由でこれを行っているため、シェルを呼び出したくないのです。
同じデータベース内でコレクションをコピーして別の名前を付けたい - 基本的にスナップショットを作成します。
これを行う最善の方法は何ですか?コマンドはありますか、それとも各レコードを順番にコピーする必要がありますか?
コマンドは認識してcloneCollection
いますが、別のサーバーへのコピー専用のようです。
と も認識しmongoimport
てmongoexport
いますが、PHP 経由でこれを行っているため、シェルを呼び出したくないのです。
いくつかのオプションがありますが、最も速いのは次のとおりです。
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 クエリを発行できます。
注:回答の更新を読んでください。重要です!
最もシンプルで効率的な方法は、copyTo()を使用することです。したがって、次を使用できます。
db.source.copyTo("target");
&"target"
存在しない場合は作成されます
- アップデート -
CopyTo Documentationによると、内部で eval を使用しているためcopyTo()
、コピー操作は mongod インスタンスでの他のすべての操作をブロックします。したがって、本番環境では使用しないでください。
- アップデート -
バージョン 3.0 以降、内部でCopyTo()
使用&が非推奨になっているため、バージョン 3.0以降も非推奨です。eval()
eval()
CopyTo()
最初のオプション (mongo dump を使用)
コレクションからダンプを取得する
mongodump -d db -c source_collection
コレクションから復元
mongorestore -d db -c target_collection dir=dump/db_name/source_collection.bson
2 番目のオプション
積算集計
db.getCollection('source_collection').aggregate([ { $match: {"emailAddress" : "apitester@mailinator.com"} }, { $out: "target_collection" } ])
3 番目のオプション (最も遅い)
for ループの実行
db.getCollection('source_collection').find().forEach(function(docs){ db.getCollection('target_collection').insert(docs); }) print("ロールバック完了!");
mongo シェルで copyDatabase 関数を使用できます。
http://docs.mongodb.org/manual/tutorial/copy-databases-between-instances/