Apakah ada cara sederhana untuk melakukan hal ini?
Apakah ada cara sederhana untuk melakukan hal ini?
Jawaban:
Saat ini tidak ada perintah di MongoDB yang akan melakukan ini. Harap perhatikan tiket JIRA dengan permintaan fitur terkait .
Anda dapat melakukan sesuatu seperti:
db.<collection_name>.find().forEach(function(d){ db.getSiblingDB('<new_database>')['<collection_name>'].insert(d); });
Harap dicatat bahwa dengan ini, kedua database harus berbagi mongod yang sama agar ini dapat berfungsi.
Selain itu, Anda bisa melakukan mongodump koleksi dari satu database dan kemudian mongorestore koleksi ke database lain.
Cara terbaik adalah melakukan mongodump lalu mongorestore.
Anda dapat memilih koleksi melalui:
mongodump -d some_database -c some_collection
[Secara opsional, masukkan zip dump ( zip some_database.zip some_database/* -r
) dan di scp
tempat lain]
Kemudian kembalikan:
mongorestore -d some_other_db -c some_or_other_collection dump/some_collection.bson
Data yang ada di some_or_other_collection
akan disimpan. Dengan begitu Anda dapat "menambahkan" koleksi dari satu basis data ke basis data lainnya.
Sebelum versi 2.4.3, Anda juga perlu menambahkan kembali indeks Anda setelah Anda menyalin data Anda. Dimulai dengan 2.4.3, proses ini otomatis, dan Anda dapat menonaktifkannya dengan --noIndexRestore
.
Sebenarnya, ada adalah perintah untuk memindahkan koleksi dari satu database ke yang lain. Hanya saja tidak disebut "pindah" atau "salin".
Untuk menyalin koleksi, Anda dapat mengkloningnya pada db yang sama, lalu memindahkan klonnya.
Untuk mengkloning:
> use db1
> db.source_collection.find().forEach( function(x){db.collection_copy.insert(x)} );
Untuk bergerak:
> use admin
switched to db admin
> db.runCommand({renameCollection: 'db1.source_collection', to: 'db2.target_collection'}) // who'd think rename could move?
Jawaban lain lebih baik untuk menyalin koleksi, tetapi ini sangat berguna jika Anda ingin memindahkannya.
'db1.source_collection'
Saya akan menyalahgunakan fungsi connect di mongo cli mongo doc . jadi itu berarti Anda dapat memulai satu atau lebih koneksi. jika Anda ingin menyalin koleksi pelanggan dari test ke test2 di server yang sama. pertama Anda mulai mongo shell
use test
var db2 = connect('localhost:27017/test2')
lakukan pencarian normal dan salin 20 catatan pertama ke test2.
db.customer.find().limit(20).forEach(function(p) { db2.customer.insert(p); });
atau filter berdasarkan beberapa kriteria
db.customer.find({"active": 1}).forEach(function(p) { db2.customer.insert(p); });
cukup ubah localhost ke IP atau nama host untuk terhubung ke server jarak jauh. Saya menggunakan ini untuk menyalin data uji ke database uji untuk pengujian.
Jika di antara dua instance mongod jarak jauh, gunakan
{ cloneCollection: "<collection>", from: "<hostname>", query: { <query> }, copyIndexes: <true|false> }
Lihat http://docs.mongodb.org/manual/reference/command/cloneCollection/
copyIndexes
opsi sebenarnya tidak dihormati. Indeks selalu disalin. Lihat SERVER-11418
untuk koleksi ukuran besar, Anda dapat menggunakan Bulk.insert ()
var bulk = db.getSiblingDB(dbName)[targetCollectionName].initializeUnorderedBulkOp();
db.getCollection(sourceCollectionName).find().forEach(function (d) {
bulk.insert(d);
});
bulk.execute();
Ini akan menghemat banyak waktu . Dalam kasus saya, saya menyalin koleksi dengan 1.219 dokumen: iter vs Massal (67 detik vs 3 detik)
Anda dapat menggunakan kerangka agregasi untuk menyelesaikan masalah Anda
db.oldCollection.aggregate([{$out : "newCollection"}])
Harus dicatat, bahwa indeks dari oldCollection tidak akan disalin di newCollection.
Saya tahu pertanyaan ini telah dijawab namun secara pribadi saya tidak akan menjawab @JasonMcCays karena fakta bahwa kursor mengalir dan ini dapat menyebabkan loop kursor tak terbatas jika koleksi masih digunakan. Sebagai gantinya saya akan menggunakan snapshot ():
http://www.mongodb.org/display/DOCS/How+to+do+Snapshotted+Queries+in+the+Mongo+Database
jawaban @bens juga bagus dan berfungsi baik untuk cadangan panas koleksi tidak hanya itu tetapi mongorestore tidak perlu berbagi mongod yang sama.
Ini mungkin hanya kasus khusus, tetapi untuk koleksi dokumen 100k dengan dua bidang string acak (panjangnya 15-20 karakter), menggunakan mapreduce bodoh hampir dua kali lebih cepat dari find-insert / copyTo:
db.coll.mapReduce(function() { emit(this._id, this); }, function(k,vs) { return vs[0]; }, { out : "coll2" })
Menggunakan pymongo, Anda harus memiliki kedua database di mongod yang sama, saya melakukan hal berikut:
db = database asli
db2 = database yang akan disalin
cursor = db["<collection to copy from>"].find()
for data in cursor:
db2["<new collection>"].insert(data)
Ini tidak akan menyelesaikan masalah Anda tetapi shell mongodb memiliki copyTo
metode yang menyalin koleksi ke koleksi lain di database yang sama :
db.mycoll.copyTo('my_other_collection');
Ini juga menerjemahkan dari BSON ke JSON, jadi mongodump
/ mongorestore
adalah cara terbaik untuk pergi, seperti yang orang lain katakan.
Jika RAM bukan masalah menggunakan insertMany
cara lebih cepat dari forEach
loop.
var db1 = connect('<ip_1>:<port_1>/<db_name_1>')
var db2 = connect('<ip_2>:<port_2>/<db_name_2>')
var _list = db1.getCollection('collection_to_copy_from').find({})
db2.collection_to_copy_to.insertMany(_list.toArray())
Jika beberapa pengguna heroku tersandung di sini dan seperti saya ingin menyalin beberapa data dari pementasan basis data ke basis data produksi atau sebaliknya inilah cara Anda melakukannya dengan sangat nyaman (NB Saya harap tidak ada kesalahan ketik di sana, tidak dapat memeriksanya atm., Saya akan mencoba mengonfirmasi validitas kode secepatnya):
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"
Anda selalu dapat menggunakan Robomongo. Pada v0.8.3 ada alat yang dapat melakukan ini dengan mengklik kanan koleksi dan memilih "Salin Koleksi ke Database"
Untuk detailnya, lihat http://blog.robomongo.org/whats-new-in-robomongo-0-8-3/
Fitur ini telah dihapus di 0.8.5 karena sifatnya yang buggy sehingga Anda harus menggunakan 0.8.3 atau 0.8.4 jika Anda ingin mencobanya.
Dalam kasus saya, saya harus menggunakan subset atribut dari koleksi lama di koleksi baru saya. Jadi saya akhirnya memilih atribut-atribut itu sambil memanggil masukkan pada koleksi baru.
db.<sourceColl>.find().forEach(function(doc) {
db.<newColl>.insert({
"new_field1":doc.field1,
"new_field2":doc.field2,
....
})
});`
gunakan "Studio3T untuk MongoDB" yang memiliki alat Ekspor dan Impor dengan mengklik pada basis data, koleksi atau tautan unduhan koleksi khusus: https://studio3t.com/download/
Ini dapat dilakukan dengan menggunakan db.copyDatabase
metode Mongo :
db.copyDatabase(fromdb, todb, fromhost, username, password)
Referensi: http://docs.mongodb.org/manual/reference/method/db.copyDatabase/