क्या ऐसा करने के लिए एक सरल तरीका है?
क्या ऐसा करने के लिए एक सरल तरीका है?
जवाबों:
फिलहाल MongoDB में कोई आदेश नहीं है जो ऐसा करेगा। कृपया संबंधित सुविधा अनुरोध के साथ JIRA टिकट पर ध्यान दें ।
आप कुछ ऐसा कर सकते हैं:
db.<collection_name>.find().forEach(function(d){ db.getSiblingDB('<new_database>')['<collection_name>'].insert(d); });
कृपया ध्यान दें कि इसके साथ, दो डेटाबेस को काम करने के लिए एक ही मोंगॉड को साझा करना होगा।
इसके अलावा, आप एक डेटाबेस से एक संग्रह का एक 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'
मैं मूंगो क्ली मोंगो डॉक में कनेक्ट फ़ंक्शन का दुरुपयोग करूंगा । तो इसका मतलब है कि आप एक या एक से अधिक कनेक्शन शुरू कर सकते हैं। यदि आप ग्राहक कलेक्शन को टेस्ट से टेस्ट 2 में एक ही सर्वर में कॉपी करना चाहते हैं। पहले आप मोंगो शेल शुरू करें
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); });
दूरस्थ सर्वर से कनेक्ट करने के लिए बस लोकलहोस्ट को आईपी या होस्टनाम में बदलें। मैं परीक्षण डेटा को परीक्षण के लिए परीक्षण डेटाबेस में कॉपी करने के लिए इसका उपयोग करता हूं।
यदि दो दूरस्थ मोंगॉड उदाहरणों के बीच, का उपयोग करें
{ 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 सेकंड बनाम 3 सेकंड)
आप अपने मुद्दे को हल करने के लिए एकत्रीकरण ढांचे का उपयोग कर सकते हैं
db.oldCollection.aggregate([{$out : "newCollection"}])
यह ध्यान दिया जाना चाहिए, कि पुराने कलेक्शन से इंडेक्स को न्यूक्लेओलेशन में कॉपी नहीं किया जाएगा।
मुझे पता है कि इस सवाल का जवाब दिया गया है, हालांकि मैं व्यक्तिगत रूप से @JasonMcCays का जवाब इस तथ्य के कारण नहीं दूंगा कि शापर्स स्ट्रीम और यह एक अनंत कर्सर लूप का कारण बन सकता है यदि संग्रह अभी भी उपयोग किया जा रहा है। इसके बजाय मैं एक स्नैपशॉट का उपयोग करेगा ():
http://www.mongodb.org/display/DOCS/How+to+do+Snapshotted+Queries+in+the+Mongo+Database
@bens का उत्तर भी एक अच्छा है और न केवल संग्रह के गर्म बैकअप के लिए अच्छी तरह से काम करता है, बल्कि mongorestore को भी उसी mongod को साझा करने की आवश्यकता नहीं है।
यह सिर्फ एक विशेष मामला हो सकता है, लेकिन दो यादृच्छिक स्ट्रिंग फ़ील्ड (लंबाई 15-20 वर्ण) के साथ 100k दस्तावेज़ों के संग्रह के लिए, एक गूंगा मैप्रेड्यूज़ का उपयोग करके लगभग दो बार तेजी से मिल-डालें / copyTo:
db.coll.mapReduce(function() { emit(this._id, this); }, function(k,vs) { return vs[0]; }, { out : "coll2" })
Pymongo का उपयोग करना, आपको एक ही mongod पर दोनों डेटाबेस रखने की आवश्यकता है, मैंने निम्नलिखित कार्य किया:
db = मूल डेटाबेस
db2 = डेटाबेस को कॉपी किया जाना है
cursor = db["<collection to copy from>"].find()
for data in cursor:
db2["<new collection>"].insert(data)
यह आपकी समस्या का समाधान नहीं करेगा लेकिन मोंगोडब शेल में एक copyTo
विधि है जो एक संग्रह को उसी डेटाबेस में दूसरे में कॉपी करता है :
db.mycoll.copyTo('my_other_collection');
यह BSON से JSON में भी अनुवाद करता है, इसलिए mongodump
/ mongorestore
जाने का सबसे अच्छा तरीका है, जैसा कि अन्य ने कहा है।
यदि RAM लूप की insertMany
तुलना में तेज़ तरीके से उपयोग करने वाली कोई समस्या नहीं है 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())
यदि कुछ हर्को यूजर्स यहां ठोकर खाते हैं और मेरे जैसा चाहते हैं कि मैं स्टेजिंग डेटाबेस से प्रोडक्शन डेटाबेस या इसके विपरीत कुछ डेटा कॉपी करना चाहता हूं तो आप इसे बहुत आसानी से कैसे कर सकते हैं (एनबी मुझे आशा है कि इसमें कोई टाइपो नहीं है, इसे एटीएम की जांच नहीं कर सकते।) मैं कोड asap की वैधता की पुष्टि करने की कोशिश करेंगे):
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"
आप हमेशा रोबोमोंगो का उपयोग कर सकते हैं। जैसा कि v0.8.3 एक उपकरण है जो संग्रह पर राइट-क्लिक करके और "डेटाबेस के लिए कॉपी संग्रह" का चयन करके ऐसा कर सकता है
जानकारी के लिए, http://blog.robomongo.org/whats-new-in-robomongo-0-8-3/ देखें।
यह सुविधा 0.8.5 में इसकी छोटी प्रकृति के कारण हटा दी गई थी, इसलिए यदि आप इसे आज़माना चाहते हैं तो आपको 0.8.3 या 0.8.4 का उपयोग करना होगा।
मेरे मामले में, मुझे अपने नए संग्रह में पुराने संग्रह से विशेषताओं का सबसेट उपयोग करना था। इसलिए मैंने नए कलेक्शन पर कॉल करते समय उन विशेषताओं को चुनना समाप्त कर दिया।
db.<sourceColl>.find().forEach(function(doc) {
db.<newColl>.insert({
"new_field1":doc.field1,
"new_field2":doc.field2,
....
})
});`
"Mong3DB के लिए Studio3T" का उपयोग करें, जिसमें डेटाबेस, संग्रह या विशिष्ट संग्रह डाउनलोड लिंक पर क्लिक करके निर्यात और आयात उपकरण हैं: https://studio3t.com/download/
यह मानगो की db.copyDatabase
विधि का उपयोग करके किया जा सकता है :
db.copyDatabase(fromdb, todb, fromhost, username, password)
संदर्भ: http://docs.mongodb.org/manual/reference/method/db.copyDatabase/