これを行う簡単な方法はありますか?
22 に答える
最善の方法は、mongodump
thenを実行することです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
。
現時点では、これを行う MongoDB のコマンドはありません。関連する機能リクエストを含む JIRA チケットに注意してください。
次のようなことができます。
db.<collection_name>.find().forEach(function(d){ db.getSiblingDB('<new_database>')['<collection_name>'].insert(d); });
これが機能するには、2 つのデータベースが同じ mongod を共有する必要があることに注意してください。
これに加えて、1 つのデータベースからコレクションの mongodump を実行してから、そのコレクションを別のデータベースに mongorestore することができます。
実際、あるデータベースから別のデータベースにコレクションを移動するコマンドがあります。「移動」や「コピー」とは呼ばないだけです。
コレクションをコピーするには、同じデータベースに複製してから、複製されたコレクションを移動します。
複製するには:
> use db1
switched to db 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'
}
);
他の回答はコレクションをコピーするのに適していますが、これはコレクションを移動する場合に特に役立ちます。
mongo cli mongo docの接続機能を悪用します。つまり、1 つ以上の接続を開始できます。顧客コレクションを test から同じサーバーの test2 にコピーする場合。最初にmongoシェルを起動します
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); });
リモートサーバーに接続するには、ローカルホストを IP またはホスト名に変更するだけです。これを使用して、テスト用のテスト データベースにテスト データをコピーします。
2 つのリモート mongod インスタンスの間の場合は、
{ cloneCollection: "<collection>", from: "<hostname>", query: { <query> }, copyIndexes: <true|false> }
http://docs.mongodb.org/manual/reference/command/cloneCollection/を参照してください。
私は通常行うだろう:
use sourcedatabase;
var docs=db.sourcetable.find();
use targetdatabase;
docs.forEach(function(doc) { db.targettable.insert(doc); });
集計フレームワークを使用して問題を解決できます
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を共有する必要はありません。
これで問題は解決しませんが、mongodb シェルには、コレクションを同じデータベース内のcopyTo
別のコレクションにコピーするメソッドがあります。
db.mycoll.copyTo('my_other_collection');
また、BSON から JSON に変換されるため、他の人が言っているように、 mongodump
/mongorestore
が最善の方法です。
ロボモンゴはいつでも使えます。v0.8.3 の時点で、コレクションを右クリックして [コレクションをデータベースにコピー] を選択することでこれを実行できるツールがあります。
詳細はhttp://blog.robomongo.org/whats-new-in-robomongo-0-8-3/を参照
この機能はバグがあるため0.8.5 で削除されたため、試してみたい場合は 0.8.3 または 0.8.4 を使用する必要があります。
これは、Mongo のdb.copyDatabase
方法を使用して行うことができます。
db.copyDatabase(fromdb, todb, fromhost, username, password)
参照: http://docs.mongodb.org/manual/reference/method/db.copyDatabase/