回答:
現時点では、MongoDBにはこれを行うコマンドはありません。JIRAチケットと関連する機能リクエストに注意してください。
あなたは次のようなことをすることができます:
db.<collection_name>.find().forEach(function(d){ db.getSiblingDB('<new_database>')['<collection_name>'].insert(d); });
これを使用する場合、これが機能するためには、2つのデータベースが同じmongodを共有する必要があることに注意してください。
これに加えて、1つのデータベースからコレクションのmongodumpを実行してから、コレクションを他のデータベースにmongorestoreすることができます。
最善の方法は、mongodumpを実行してから、mongorestoreを実行することです。
次の方法でコレクションを選択できます。
mongodump -d some_database -c some_collection
[オプションで、ダンプ(zip some_database.zip some_database/* -r
)とscp
その他の場所を圧縮します]
次に、それを復元します。
mongorestore -d some_other_db -c some_or_other_collection dump/some_collection.bson
の既存のデータはsome_or_other_collection
保持されます。これにより、あるデータベースから別のデータベースにコレクションを「追加」できます。
バージョン2.4.3より前のバージョンでは、データをコピーした後、インデックスを追加する必要があります。2.4.3以降、このプロセスは自動的に行われ、で無効にすることができます--noIndexRestore
。
実際には、あるデータベースから別のデータベースにコレクションを移動するコマンドがあります。「移動」や「コピー」とは呼ばれません。
コレクションをコピーするには、同じdbにコレクションを複製してから、その複製を移動します。
複製するには:
> use db1
> db.source_collection.find().forEach( function(x){db.collection_copy.insert(x)} );
移動するには:
> use admin
switched to db admin
> db.runCommand({renameCollection: 'db1.source_collection', to: 'db2.target_collection'}) // who'd think rename could move?
他の答えはコレクションをコピーするのに適していますが、これは移動したい場合に特に便利です。
'db1.source_collection'
mongo cli mongo docの接続機能を悪用します。つまり、1つ以上の接続を開始できます。同じサーバーでテストからtest2に顧客コレクションをコピーする場合。最初にモンゴシェルを起動します
use test
var db2 = connect('localhost:27017/test2')
通常の検索を行い、最初の20レコードをtest2にコピーします。
db.customer.find().limit(20).forEach(function(p) { db2.customer.insert(p); });
またはいくつかの基準でフィルタリングする
db.customer.find({"active": 1}).forEach(function(p) { db2.customer.insert(p); });
localhostをIPまたはホスト名に変更して、リモートサーバーに接続するだけです。これを使用して、テスト用のテストデータベースにテストデータをコピーします。
2つのリモートmongodインスタンス間にある場合は、
{ cloneCollection: "<collection>", from: "<hostname>", query: { <query> }, copyIndexes: <true|false> }
http://docs.mongodb.org/manual/reference/command/cloneCollection/を参照してください
copyIndexes
オプションフィールドは、実際に尊重されていません。インデックスは常にコピーされます。SERVER-11418を参照
巨大なサイズのコレクションの場合、Bulk.insert()を使用できます
var bulk = db.getSiblingDB(dbName)[targetCollectionName].initializeUnorderedBulkOp();
db.getCollection(sourceCollectionName).find().forEach(function (d) {
bulk.insert(d);
});
bulk.execute();
これは多くの時間を節約します。私の場合、1219ドキュメントのコレクションをコピーしています:iter vs Bulk(67秒vs 3秒)
集計フレームワークを使用して問題を解決できます
db.oldCollection.aggregate([{$out : "newCollection"}])
oldCollectionのインデックスはnewCollectionにコピーされないことに注意してください。
私はこの質問に回答したことを知っていますが、カーソルがストリームし、コレクションがまだ使用されている場合、これが無限カーソルループを引き起こす可能性があるため、個人的に@JasonMcCaysの回答は行いません。代わりに、snapshot()を使用します。
http://www.mongodb.org/display/DOCS/How+to+do+Snapshotted+Queries+in+the+Mongo+Database
@bensの回答も良い回答であり、コレクションのホットバックアップに適しているだけでなく、mongorestoreが同じmongodを共有する必要もありません。
pymongoを使用して、両方のデータベースを同じmongodに置く必要があります。私は次のようにしました。
db =元のデータベース
db2 =コピー先のデータベース
cursor = db["<collection to copy from>"].find()
for data in cursor:
db2["<new collection>"].insert(data)
これで問題は解決しませんが、mongodbシェルには、同じデータベース内のcopyTo
別のコレクションにコレクションをコピーするメソッドがあります。
db.mycoll.copyTo('my_other_collection');
また、BSONからJSONに変換されるため、他の人が言っているように、mongodump
/ mongorestore
が最適な方法です。
一部のherokuユーザーがここでつまずいて、ステージングデータベースから本番データベースにデータをコピーしたり、その逆の場合は、ここで非常に便利です(タイプミスがないことを確認して、atmをチェックできません)。私はできるだけ早くコードの有効性を確認してみます):
to_app="The name of the app you want to migrate data to"
from_app="The name of the app you want to migrate data from"
collection="the collection you want to copy"
mongohq_url=`heroku config:get --app "$to_app" MONGOHQ_URL`
parts=(`echo $mongohq_url | sed "s_mongodb://heroku:__" | sed "s_[@/]_ _g"`)
to_token=${parts[0]}; to_url=${parts[1]}; to_db=${parts[2]}
mongohq_url=`heroku config:get --app "$from_app" MONGOHQ_URL`
parts=(`echo $mongohq_url | sed "s_mongodb://heroku:__" | sed "s_[@/]_ _g"`)
from_token=${parts[0]}; from_url=${parts[1]}; from_db=${parts[2]}
mongodump -h "$from_url" -u heroku -d "$from_db" -p"$from_token" -c "$collection" -o col_dump
mongorestore -h "$prod_url" -u heroku -d "$to_app" -p"$to_token" --dir col_dump/"$col_dump"/$collection".bson -c "$collection"
Robomongoはいつでも使用できます。v0.8.3以降、コレクションを右クリックして[コレクションをデータベースにコピー]を選択することでこれを実行できるツールがあります。
詳細については、http://blog.robomongo.org/whats-new-in-robomongo-0-8-3/を参照してください
この機能はバグが多いため0.8.5で削除されたので、試してみる場合は0.8.3または0.8.4を使用する必要があります。
データベース、コレクション、または特定のコレクションのダウンロードリンクをクリックして、エクスポートツールとインポートツールを備えた「Studio3T for MongoDB」を使用します。https://studio3t.com/download/
これは、Mongoのdb.copyDatabase
メソッドを使用して行うことができます。
db.copyDatabase(fromdb, todb, fromhost, username, password)
リファレンス:http : //docs.mongodb.org/manual/reference/method/db.copyDatabase/