Bunu yapmanın kolay bir yolu var mı?
Bunu yapmanın kolay bir yolu var mı?
Yanıtlar:
Şu anda MongoDB'de bunu yapacak bir komut yok. Lütfen ilgili özellik talebiyle JIRA biletine dikkat edin .
Şöyle bir şey yapabilirsiniz:
db.<collection_name>.find().forEach(function(d){ db.getSiblingDB('<new_database>')['<collection_name>'].insert(d); });
Bununla birlikte, bunun için iki veritabanının aynı mongodu paylaşması gerekeceğini lütfen unutmayın.
Bunun yanı sıra, bir veritabanından bir koleksiyonun bir mongodump yapabilir ve daha sonra koleksiyonu diğer veritabanına mongorestore edebilirsiniz.
En iyi yol bir mongodump sonra mongorestore yapmaktır.
Koleksiyonu aşağıdaki yollarla seçebilirsiniz:
mongodump -d some_database -c some_collection
[İsteğe bağlı olarak, çöplüğü ( zip some_database.zip some_database/* -r) ve scpbaşka bir yere sıkıştırın]
Sonra geri yükleyin:
mongorestore -d some_other_db -c some_or_other_collection dump/some_collection.bson
Mevcut veriler some_or_other_collectionkorunacaktır. Bu şekilde bir koleksiyonu bir veritabanından diğerine "ekleyebilirsiniz".
2.4.3 sürümünden önce, verilerinizi kopyaladıktan sonra dizinlerinizi geri eklemeniz gerekir. 2.4.3'ten başlayarak, bu işlem otomatiktir ve ile devre dışı bırakabilirsiniz --noIndexRestore.
Aslında, olup bir komut taşımak başka bir veritabanından bir koleksiyon. Sadece "taşı" veya "kopyala" olarak adlandırılmaz.
Bir koleksiyonu kopyalamak için, aynı db üzerinde klonlayabilir, sonra klonu taşıyabilirsiniz.
Klonlama:
> use db1
> db.source_collection.find().forEach( function(x){db.collection_copy.insert(x)} );
Taşımak:
> use admin
switched to db admin
> db.runCommand({renameCollection: 'db1.source_collection', to: 'db2.target_collection'}) // who'd think rename could move?
Diğer cevaplar koleksiyonu kopyalamak için daha iyidir, ancak bu özellikle taşımak istiyorsanız faydalıdır.
'db1.source_collection'
Mongo cli mongo doc bağlantı işlevini kötüye kullanır . yani bir veya daha fazla bağlantı başlatabilirsiniz. müşteri koleksiyonunu aynı sunucudan testten test2'ye kopyalamak istiyorsanız. önce mongo kabuğuna başlarsınız
use test
var db2 = connect('localhost:27017/test2')
Normal bir bulgu bulun ve ilk 20 kaydı test2'ye kopyalayın.
db.customer.find().limit(20).forEach(function(p) { db2.customer.insert(p); });
veya bazı ölçütlere göre filtreleyin
db.customer.find({"active": 1}).forEach(function(p) { db2.customer.insert(p); });
Uzak sunucuya bağlanmak için localhost'u IP veya ana bilgisayar adı olarak değiştirmeniz yeterlidir. Bu test verilerini test için bir test veritabanına kopyalamak için kullanın.
İki uzak mongod örneği arasındaysa,
{ cloneCollection: "<collection>", from: "<hostname>", query: { <query> }, copyIndexes: <true|false> }
Bkz. Http://docs.mongodb.org/manual/reference/command/cloneCollection/
copyIndexesOpsiyon alanın aslında uyulmaz. Dizinler her zaman kopyalanır. Bkz SERVER-11418
büyük boyutlu koleksiyonlar için Bulk.insert () kullanabilirsiniz
var bulk = db.getSiblingDB(dbName)[targetCollectionName].initializeUnorderedBulkOp();
db.getCollection(sourceCollectionName).find().forEach(function (d) {
bulk.insert(d);
});
bulk.execute();
Bu çok zaman kazandıracak . Benim durumumda, koleksiyonu 1219 belge ile kopyalıyorum: iter vs Bulk (67 sn vs 3 sn)
Sorununuzu çözmek için birleştirme çerçevesi kullanabilirsiniz
db.oldCollection.aggregate([{$out : "newCollection"}])
OldCollection dizinlerinin newCollection içinde kopyalanmayacağı belirtilmelidir.
Bu soruya cevap verildiğini biliyorum ancak imleç akışı nedeniyle kişisel olarak @JasonMcCays cevap vermez ve koleksiyon hala kullanılıyorsa bu sonsuz bir imleç döngüsüne neden olabilir. Bunun yerine bir snapshot () kullanırdım:
http://www.mongodb.org/display/DOCS/How+to+do+Snapshotted+Queries+in+the+Mongo+Database
@bens yanıtı da iyi bir sorudur ve koleksiyonların sıcak yedeklemeleri için iyi çalışır, ancak mongorestore'nun aynı mongodu paylaşması gerekmez.
Bu sadece özel bir durum olabilir, ancak iki rastgele dize alanı (uzunluk 15-20 karakter) olan 100k'lık bir belge koleksiyonu için, aptal bir mapreduce kullanmak find-insert / copy'den neredeyse iki kat daha hızlıdır
db.coll.mapReduce(function() { emit(this._id, this); }, function(k,vs) { return vs[0]; }, { out : "coll2" })
Pymongo kullanarak, aynı mongod üzerinde her iki veritabanına da ihtiyacınız var, aşağıdakileri yaptım:
db = orijinal veritabanı
db2 = kopyalanacak veritabanı
cursor = db["<collection to copy from>"].find()
for data in cursor:
db2["<new collection>"].insert(data)
Bu sorununuzu çözmez, ancak mongodb kabuğunun copyTobir koleksiyonu aynı veritabanındaki başka bir koleksiyona kopyalayan bir yöntemi vardır :
db.mycoll.copyTo('my_other_collection');
Ayrıca BSON'dan JSON'a çevirir, bu yüzden mongodump/ mongorestorediğerleri söylediği gibi gitmek için en iyi yoldur.
RAM bir sorun değilse kullanmak döngüden insertManydaha hızlıdır forEach.
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())
Bazı heroku kullanıcılarının burada tökezlemesi ve benim gibi bazı aşamaları veritabanından üretim veritabanına veya tam tersine bazı verileri kopyalamak istemesi durumunda, bunu çok kolay bir şekilde nasıl yapacağınız (NB Umarım orada yazım hatası yoktur, atm kontrol edemezsiniz., Kodun geçerliliğini en kısa sürede teyit edeceğim):
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'yu her zaman kullanabilirsiniz. V0.8.3 itibariyle, koleksiyona sağ tıklayıp "Koleksiyonu Veritabanına Kopyala" yı seçerek bunu yapabilen bir araç vardır.
Ayrıntılar için bkz. Http://blog.robomongo.org/whats-new-in-robomongo-0-8-3/
Bu özellik, buggy yapısı nedeniyle 0.8.5'te kaldırıldı, bu yüzden denemek istiyorsanız 0.8.3 veya 0.8.4 kullanmanız gerekecek.
Benim durumumda, yeni koleksiyonumda eski koleksiyondan bir dizi öznitelik kullanmak zorunda kaldım. Böylece yeni koleksiyonda insert çağırırken bu özellikleri seçtim.
db.<sourceColl>.find().forEach(function(doc) {
db.<newColl>.insert({
"new_field1":doc.field1,
"new_field2":doc.field2,
....
})
});`
veritabanı, koleksiyonlar veya özel koleksiyon indirme bağlantısına tıklayarak Verme ve Alma araçları olan "MongoDB için Studio3T" kullanın: https://studio3t.com/download/
Bu Mongo'nun db.copyDatabaseyöntemi kullanılarak yapılabilir :
db.copyDatabase(fromdb, todb, fromhost, username, password)
Referans: http://docs.mongodb.org/manual/reference/method/db.copyDatabase/