2011-09-30 22 views
63

में स्कीमा परिवर्तनों से निपटने के लिए आवेदन के रूप में मोंगोस स्कीमा को अपडेट/माइग्रेट करने के लिए सबसे अच्छा अभ्यास (या टूल) क्या है?मोंगोस

उत्तर

5

अद्यतन: परीक्षण किया गया, यह अपने मौजूदा रूप में काम नहीं करता है, इसकी मिला सही विचार के लिए जा रहा है, मैं काफी फेरबदल के साथ काम करने के लिए एक एकल प्रवास मिला मॉड्यूल स्वयं लेकिन मैं इसे कुछ बड़े बदलावों के बिना और विभिन्न स्कीमाओं का ट्रैक रखने के इरादे से काम नहीं कर रहा हूं।


ऐसा लगता है कि आप चाहते हैं नेवला-डेटा-माइग्रेशन

यह अपने दस्तावेज़ के पुराने स्कीमा संस्करणों विस्थापित करने के लिए के रूप में आप उन्हें प्रयोग है, जो करना है सबसे अच्छा तरीका है MongoDB में माइग्रेशन को संभालने के लिए हो रहा है।

आप वास्तव में दस्तावेज़ संग्रह (एला परिवर्तन तालिका) पर पूर्ण डेटासेट माइग्रेशन नहीं करना चाहते हैं क्योंकि यह आपके सर्वर पर भारी भार डालता है और एप्लिकेशन/सर्वर डाउनटाइम की आवश्यकता हो सकती है। कभी-कभी आपको एक स्क्रिप्ट लिखने की आवश्यकता हो सकती है जो सभी दस्तावेजों को पकड़ लेती है, नई स्कीमा/बदलाव लागू करती है और कॉल को सहेजती है, लेकिन आपको यह समझने की आवश्यकता है कि उसे कब/कहां करना है। एक उदाहरण हो सकता है, माइक्रोसॉफ्ट लॉजिक को डॉक इनिट में जोड़ने से माइग्रेशन स्क्रिप्ट चलाने के लिए सर्वर को 3 घंटे तक ले जाने से अधिक प्रदर्शन हिट होता है।

मुझे यह link बहुत उपयोगी पाया गया है, मूल रूप से उपरोक्त को अधिक विस्तार से दोहराता है और अनिवार्य रूप से उपरोक्त नोड पैकेज की अवधारणा को php में लागू करता है।

एनबी। मॉड्यूल, 5months वर्ष 0 कांटे, लेकिन चारों ओर देख रहा हूँ और कुछ भी बेहतर/प्रतिक्रिया की abdelsaid की शैली से अधिक उपयोगी नहीं मिल सकता है ..

+0

कम से कम कुछ भी उभरने तक स्वीकृत। क्या आप कृपया उस चेतावनी को अपने उत्तर में जोड़ सकते हैं क्योंकि हर कोई टिप्पणी नहीं देख पाएगा। – mahemoff

+1

जोड़ा गया नोट, इसे कल करने की आवश्यकता होगी, किसी अन्य समस्या से अवरुद्ध हो गया है। – Louis

+1

अपडेट किया गया। दुख की बात है कि इसके बजाय टूटा हुआ। अगर आपको कभी भी कुछ मिलता है, तो मुझे यहां बताएं, जैसे ही आप विधि के साथ अद्यतन के लिए उपयुक्त समाधान चाहते हैं। मुझे लगता है कि पुराने स्कीमा लोड करने के लिए आपको प्रत्येक संस्करण का ट्रैक रखने की आवश्यकता होगी और मॉड्यूल के प्रयासों को संशोधित करने की अनुमति दें। हां, मेरे मोंगोज़ ज्ञान अब तक बहुत कम है। वहाँ पर होना! – Louis

32

हालांकि यह मजाकिया है, मोंगोडीबी का जन्म आरडीबीएमएस में स्कीमा समस्याओं के जवाब में हुआ था। आपको कुछ भी माइग्रेट करने की आवश्यकता नहीं है, यदि आपको फ़ील्ड की आवश्यकता है तो आपको केवल स्कीमा परिभाषा में डिफ़ॉल्ट मान सेट करना है।

new Schema({ 
    name: { type: string } 
}) 

रहे हैं:

new Schema({ 
    name: { type: string }, 
    birthplace: { type: string, required: true, default: 'neverborn' } 
}); 
+1

मैं वास्तव में रेल के माइग्रेशन जैसे टूल के बारे में सोच रहा हूं जो आपको परिवर्तन प्रबंधन पहलुओं को संभालने देता है, लेकिन मुझे नहीं लगता कि वास्तव में ऐसा कुछ भी है, इसलिए मैं इसे स्वीकार करूंगा। – mahemoff

+0

मुझे पता है कि आपका क्या मतलब है लेकिन मुझे दस्तावेज़ आधारित डेटाबेस में इसके लिए उपयोगिता दिखाई नहीं दे रही है या क्या मैं गलत हूं? यदि आप अपने स्कीमा को स्रोत नियंत्रण में Mercurial/Subversion/git के अंतर्गत रखते हैं, तो आप हमेशा पिछले संशोधनों पर वापस जा सकते हैं। – vimdude

+3

मुझे नहीं लगता कि यह SQL डेटाबेस से बहुत अलग है। उदाहरण के लिए आप "name" को "firstname" और "उपनाम" फ़ील्ड में विभाजित कर सकते हैं ... आपको प्रत्येक पर्यावरण के डेटाबेस के विरुद्ध उस परिवर्तन को चलाने और इसे किसी भी तरह ट्रैक करना होगा। – mahemoff

6

मैं सिर्फ इस समस्या को जहां मैं अपने डेटाबेस अद्यतन करने को प्रतिबिंबित करने के लिए आवश्यक था मेरी स्कीमा में परिवर्तन। कुछ शोध के बाद मैंने अपडेट करने के लिए मोंगो कंसोल में अद्यतन मैनी() फ़ंक्शन को आजमाने का फैसला किया और मुझे लगता है कि यह बहुत अच्छी तरह से काम करता है।

vimdude के उदाहरण को यह लागू करने के लिए इस प्रकार कोड दिखेगा:

try { db.<collection>.updateMany({ birthplace: null }, { $set: {"birthplace": "neverborn" } }); } catch(e) { print(e); } 

updateMany() फ़ंक्शन एक संग्रह एक फिल्टर के आधार पर में सभी दस्तावेजों अद्यतन करेगा। इस मामले में फ़िल्टर उन सभी दस्तावेजों की तलाश में है जहां फ़ील्ड 'जन्मस्थल' शून्य है। इसके बाद 'जन्मस्थान' नामक उन दस्तावेजों में एक नया क्षेत्र निर्धारित होता है और इसका मूल्य 'कभी नहीं' होता है।

कोड, अपनी परिस्थितियों को प्रतिबिंबित करने के लिए संशोधित चलाने के बाद चलाएँ:

db.<collection>.find().pretty() 

सत्यापित करने के लिए परिवर्तन किए गए। "कभी नहीं" के मूल्य के साथ नया क्षेत्र "जन्मस्थान" आपके संग्रह में प्रत्येक दस्तावेज़ के अंत में दिखाना चाहिए।

उम्मीद है कि मदद करता है।

संबंधित मुद्दे