2012-01-19 15 views
45

में एक संग्रह क्लोन करें, मैं एक मोंगोडीबी संग्रह क्लोन करना चाहता हूं और इसे एक ही सर्वर पर एक अलग नाम से सहेजना चाहता हूं। तो उदाहरण के लिए अभी मेरे पास निम्नलिखित संग्रह हैं: demo1.categories, demo1.users और demo2.users।MongoDB

मैं "demo2.categories" होना चाहता हूं जो "demo1.categories" के समान है। (यह सिर्फ एक अलग नाम है।)

उत्तर

76

एक बार फिर MongoDB documentation comes to the rescue

यह सोचते हैं कि संग्रह वास्तव में नाम है "demo1.categories":

db.demo1.categories.find().forEach(function(x){db.demo2.categories.insert(x)}); 
+2

मिठाई, भाग्यशाली आकर्षण की तरह काम किया है! धन्यवाद :) – Daryna

+53

2.1+ के रूप में आप db.demo1.copyTo ("डेमो 2") कर सकते हैं; –

+12

'copyTo' अन्य सभी परिचालनों को मैकोड इंस्टेंस – r92

2

वहाँ पहले से ही इस के लिए एक कमांड है।

एक सर्वर से दूसरे सर्वर पर एक संग्रह की प्रतिलिपि बनाएँ। http://www.mongodb.org/display/DOCS/cloneCollection+Command

+7

पर पेस्ट करें आप सही हैं कि यह आदेश आपको एक सर्वर से दूसरे सर्वर पर कॉपी करने की अनुमति देगा। हालांकि, मूल प्रश्न एक ही सर्वर को संदर्भित करता है। जैसा कि प्रलेखन इंगित करता है, यदि आप मूल प्रश्न के लक्ष्य –

-2

मोंगो कंसोल में, आप निम्न कार्य भी कर सकते हैं, जहां db_host मशीन है जहां db_host को उस संग्रह के साथ डीबी है जिसे आप क्लोन करना चाहते हैं।

उपयोग db.cloneCollection (,)

+0

के लिए क्लोन कोलेक्शन कमांड का उपयोग करने का प्रयास करते हैं तो आप अपना संग्रह खो देंगे क्षमा करें, कुछ प्रारूपण समस्याएं थीं, इसे db_name का उपयोग करना चाहिए, फिर db.cloneCollection (collection_name, db_host) –

+1

और db_host को उलट दें और संग्रह नाम यानी db.cloneCollection (होस्ट, संग्रह) –

+0

जो काम नहीं करता है: {"ok": 0, "errmsg": "क्लोन नहीं कर सकता स्वयं से चयन"} –

28

सबसे सरल & कारगर तरीका copyTo() का उपयोग करके, है तो आप उपयोग कर सकते हैं:

db.source.copyTo("target"); 

& अगर "target" मौजूद नहीं है, यह हो जाएगा बनाया

- अद्यतन -

CopyTo Documentation के अनुसार, क्योंकि copyTo() आंतरिक रूप से eval का उपयोग करता है, प्रतिलिपि संचालन मैंगोड उदाहरण पर अन्य सभी परिचालनों को अवरुद्ध कर देगा। तो इसे उत्पादन पर्यावरण पर इस्तेमाल नहीं किया जाना चाहिए।

- अपडेट -

क्योंकि CopyTo() आंतरिक & eval()eval() का उपयोग करता है संस्करण 3.0 के बाद से हटा दिया गया है, इसलिए CopyTo() भी 3.0 संस्करण के बाद से मान्य नहीं है।

mongoexport -d db_name -c src_collection | mongoimport -d db_name -c dst_collection --drop 

यह db_name को dst_collection में src_collection क्लोन होगा:

+2

कॉपी सिस्टम को उत्पादन प्रणाली पर न चलाएं। जैसा कि स्वीकृत उत्तर के लिए एक टिप्पणी में उल्लिखित है, यह आपके मोंगोड इंस्टेंस पर अन्य परिचालनों को प्रभावी रूप से अवधि के लिए अनुपलब्ध बना देगा। –

+0

@JamesWahlin नोट के लिए धन्यवाद, मैंने जवाब अपडेट किया है, इसलिए हर कोई इसे आसानी से देख सकता है – AbdelHady

+0

'क्लोन कोलेक्शनएस्केप' अन्य परिचालनों को भी अवरुद्ध करता है। मैंने इसे अनुभवी रूप से खोजा ... – Emer

18

यह अपने संग्रह क्लोन करने के लिए सबसे तेज़ तरीका है।आप या bson स्तर पर दो चरणों में यह कर सकते हैं:

mongodump -d db_name -c src_collection 
mongorestore --drop -d db_name -c dst_collection ./dump/db_name/src_collection.bson 
+2

आप वास्तव में मेरा दिन बचाते हैं। ऐसा करने का यह सबसे आसान तरीका था: डी धन्यवाद! – cgajardo

+3

इस तरह से यह सबसे आसान नहीं है, बल्कि आपको बाइनरी स्तर पर 100% पहचान की भी गारंटी देता है, लेकिन() और डालने() तरीका नहीं मिलता है। उदाहरण के लिए, यह आपके सभी पूर्णांक रिकॉर्ड्स को न्यूमेरिक्स में परिवर्तित करता है, आदि – Tutankhamen

+0

अच्छा और साफ +1 –

2

तुम गति के बारे में चिंतित तो मैंने पाया कि $project और $out साथ aggregate का उपयोग करके एक 100 गुना तेजी से, यकीन नहीं अगर वहाँ प्रतिबंध नहीं होने के लिए तो हालांकि, लेकिन आप क्षेत्रों का एक सेट है कि आप उदाहरण के लिए नकल करना चाहते हैं बनाना होगा:

// Set of fields in the categories collection var setOfFields = {field1:1, field2:1.......} db.demo1.categories.aggregate([{ "$project": setOfFields},{ $out: "demo2.categories"}]);

यह प्रतियां (परियोजनाओं) demo1.categoriesसे करने के लिए सभी दस्तावेजों के लिए खेतों के चयनित समूह

11

सबसे तेजी से विकल्प

db.myoriginal.aggregate([ { $out: "mycopy" } ]) 
+0

मैं अपने node.js एप्लिकेशन में https://github.com/caolan/async का उपयोग कर रहा हूं और यह mongodb के लिए काम नहीं करता है node.js ड्राइवर - अब मैं 'ढूंढें() .EE (....)' समाधान का उपयोग कर रहा हूं - अभी भी इसे ऊपर उठाया गया क्योंकि यह कंसोल में काम करता है –