2009-11-19 9 views
22

मैं मोंगोडीबी का उपयोग बैक एंड एंड मोंगोमैपर के रूप में ओआरएम उपकरण के रूप में एक रेल एप्लिकेशन बना रहा हूं। संस्करण 1 में मान लीजिए, मैं निम्नलिखित मॉडल को परिभाषित:मोंगोमैपर और माइग्रेशन

class SomeModel 
    include MongoMapper::Document 
    key :some_key, String 
end 

संस्करण 2 में बाद में, मुझे लगता है मैं मॉडल पर एक नया आवश्यक कुंजी की आवश्यकता है। तो, संस्करण 2 में, SomeModel अब इस तरह दिखता है:

class SomeModel 
    include MongoMapper::Document 
    key :some_key, String 
    key :some_new_key, String, :required => true 
end 

मैं अपने सभी मौजूदा डेटा कैसे माइग्रेट some_new_key शामिल करने के लिए करते हैं? मान लें कि मुझे पता है कि सभी मौजूदा दस्तावेज़ों के लिए उचित डिफ़ॉल्ट मान कैसे सेट करें। इसे एक कदम आगे लेते हुए, मान लीजिए कि संस्करण 3 में, मुझे एहसास हुआ कि मुझे वास्तव में कुछ_की की आवश्यकता नहीं है। तो, अब मॉडल इस

class SomeModel 
    include MongoMapper::Document 
    key :some_new_key, String, :required => true 
end 

लेकिन मेरे डेटाबेस में सभी मौजूदा रिकॉर्ड some_key के लिए मान सेट है की तरह लग रहा है, और यह सिर्फ इस बिंदु पर अंतरिक्ष बर्बाद कर रहा है। मैं उस जगह को पुनः प्राप्त कैसे करूं?

ActiveRecord के साथ, मैंने कुछ_new_key (संस्करण 1 -> संस्करण 2 माइग्रेशन में) के प्रारंभिक मान जोड़ने और कुछ_key (संस्करण 2 -> संस्करण 3 माइग्रेशन में) के मानों को हटाने के लिए माइग्रेशन बनाए हैं।

MongoDB/MongoMapper के साथ ऐसा करने का उचित तरीका क्या है? ऐसा लगता है कि माइग्रेशन चलाने के कुछ तरीकों को अभी भी जरूरी है। क्या ऐसी किसी वस्तु का अस्तित्व है?

संपादित किया गया: मुझे लगता है कि लोग मेरे प्रश्न का बिंदु खो रहे हैं। ऐसे समय होते हैं जहां आप डेटा को बदलने या पुन: स्थापित करने के लिए डेटाबेस पर एक स्क्रिप्ट चलाने में सक्षम होना चाहते हैं। मैंने उपरोक्त दो उदाहरण दिए, एक जहां एक नई आवश्यक कुंजी जोड़ा गया था और एक जहां एक कुंजी को हटाया जा सकता है और अंतरिक्ष को पुनः दावा किया जा सकता है। आप इन स्क्रिप्ट को चलाने का प्रबंधन कैसे करते हैं? ActiveRecord माइग्रेशन आपको इन स्क्रिप्ट को चलाने और यह निर्धारित करने के लिए एक आसान तरीका प्रदान करता है कि कौन सी स्क्रिप्ट पहले ही चल चुकी हैं और कौन सी स्क्रिप्ट नहीं चल रही हैं। मैं स्पष्ट रूप से एक मोंगो स्क्रिप्ट लिख सकता हूं जो डेटाबेस पर कोई अपडेट करता है, लेकिन जो मैं खोज रहा हूं वह माइग्रेशन की तरह एक ढांचा है जो मुझे ट्रैक करने देता है कि कौन सी अपग्रेड स्क्रिप्ट पहले ही चल चुकी है।

+0

मुझे लगता है कि मोंगो (/ मैपर) इस तरह की चीज़ के लिए बहुत ही युवा हो सकता है। :/ – Konklone

+0

स्कीमा के मामले में माइग्रेशन वास्तव में मोंगो डीबी में उचित अवधारणा नहीं है क्योंकि मोंगो डीबी में वास्तव में कोई स्कीमा नहीं है। आपको केवल डेटा माइग्रेशन स्क्रिप्ट लिखना होगा। – zsong

उत्तर

13

मोंग्रेशंस देखें ... मैंने अभी इसके बारे में पढ़ना समाप्त कर दिया है और ऐसा लगता है कि आप क्या कर रहे हैं।

http://terrbear.org/?p=249

http://github.com/terrbear/mongrations

चीयर्स! Kapslok

+1

रेल 3 के लिए, भयभीत होने के इस कांटा को देखें: https://github.com/TheHiveProjects/mongrations। (इस लेखन के अनुसार, यह सबसे हालिया कामों के साथ कांटा है।) मुझे इसे 'मणि' mongrations 'निर्दिष्ट करना था, git =>' git: // github.com/TheHiveProjects/mongrations.git'' इसे प्राप्त करने के लिए काम करने के लिए। – colllin

-5

MongoDB एक स्कीमा-कम डेटाबेस है। यही कारण है कि कोई प्रवास नहीं है। डेटाबेस में ही, इससे कोई फ़र्क नहीं पड़ता कि ऑब्जेक्ट्स की कुंजी है: some_key या key: some_other_key किसी भी समय।

MongoMapper इस पर कुछ प्रतिबंध लागू करने का प्रयास करता है, लेकिन चूंकि डेटाबेस इतना लचीला है, इसलिए आपको उन प्रतिबंधों को स्वयं बनाए रखना होगा। यदि आपको प्रत्येक ऑब्जेक्ट पर एक कुंजी की आवश्यकता है, तो सुनिश्चित करें कि आप पूर्व-मौजूदा ऑब्जेक्ट्स पर उन चाबियों को अपडेट करने के लिए एक स्क्रिप्ट चलाते हैं, या उस ऑब्जेक्ट के मामले को संभालें जिसमें आपके पास आने वाली कुंजी नहीं है।

मैं मोंगोडीबी के लिए बिल्कुल नया हूं, लेकिन जहां तक ​​मैं देख सकता हूं, स्कीमा-कम डीबी की लचीलापन के कारण आपको इसे संभालने की आवश्यकता होगी।

+9

मैं इस तर्क के साथ समस्या उठाता हूं: "मोंगोडीबी एक स्कीमा-कम डेटाबेस है। यही कारण है कि कोई माइग्रेशन नहीं है।" हालांकि मोंगोडीबी आपके दस्तावेज़ों में एक स्कीमा लागू नहीं करता है, प्रैक्टिस में आप शायद अपने आवेदन को स्कीमा को कुछ डिग्री तक लागू करना चाहते हैं। यदि आप "माइग्रेशन" को थोड़ा अधिक व्यापक रूप से परिभाषित करते हैं तो यह देखना आसान है कि मोंगोडीबी समर्थित वेब एप्लिकेशन को माइग्रेशन की आवश्यकता हो सकती है। यह सच है कि एक प्रकार का माइग्रेशन एक "औपचारिक" स्कीमा माइग्रेशन है।लेकिन ऐसे कई प्रकार के माइग्रेशन हैं जो अभी भी बहुत महत्वपूर्ण हैं: कुंजी जोड़ना, चाबियाँ बदलने, डेटा बदलने आदि। –

+11

डेटा ट्रांसफॉर्मेशन माइग्रेशन हैं। MongoDB डेटा है। –

1

एक विकल्प update ऑपरेशन का उपयोग अपने सभी डेटा को एक बार में अपडेट करने के लिए करना है। मल्टी अपडेट विकास रिलीज में नया है, इसलिए आपको उनमें से एक का उपयोग करने की आवश्यकता होगी।

-1

मुझे लगता है कि आप अपने "माइग्रेशन" स्क्रिप्ट को स्वचालित और ट्रैक करने के लिए Activerecord :: मिरेशन में हुक कर सकते हैं।

1

आप अभी इस अनुबंध को आजमा सकते हैं, लेकिन यह इस समय केवल मोंगोइड और रेल 3 (बीटा 3) के साथ काम करता है। http://github.com/adacosta/mongoid_rails_migrations। अंतिम होने पर इसे रेल 3 में अपग्रेड कर दिया जाएगा।

0

क्लिंट,

आप अद्यतन करने के लिए कोड लिख सकते हैं - हालांकि ऐसा लगता है कि अपने स्वयं के क्षेत्रों के आधार पर एक रिकॉर्ड को अपडेट करने के लिए समर्थित नहीं है।

इस तरह के एक मामले में, मैं निम्नलिखित किया था और यह सर्वर के खिलाफ भाग गया:

------------------------------ 
records = Patient.all() 

records.each do |p| 
    encounters = p.encounters 
    if encounters.nil? || encounters.empty? 
    mra = p.updated_at 
    #puts "\tpatient...#{mra}" 
    else 
    mra = encounters.last.created_at 
    #puts "\tencounter...#{mra}" 
    end 
    old = p.most_recent_activity 
    p.most_recent_activity = mra 
    p.save! 
    puts "#{p.last_name} mra: #{old} now: #{mra}" 
end 
------------------------------ 
1

Mongrations के लिए एक और मणि एक सुपर पुराने मणि, पूरी तरह से बहिष्कृत कर दिया गया है। मैं इसका उपयोग नहीं करने की सलाह देते हैं।

पलायन मोंगो के लिए एक बहुत अच्छा प्रवास रूपरेखा है, कि हो सकता है कि आप क्या चाहते:

https://github.com/ThomasAlxDmy/Exodus

1

हम सिर्फ निर्माण इस एक: https://github.com/eberhara/mongration - यह एक नियमित रूप से नोड मॉड्यूल है (यदि आप इसे पर पा सकते हैं NPM)।

हमें एक अच्छा मोंगोड माइग्रेशन फ्रेमवर्क चाहिए, लेकिन कोई भी नहीं मिला - इसलिए हमने एक बनाया।

यह बहुत की नियमित प्रवास चौखटे की तुलना में बेहतर सुविधाओं के होते हैं:

  • Checksum
  • मोंगो के लिए प्रवास राज्य बनी रहती है (एक त्रुटि जब एक previosuly प्रवास दौड़ा अपने पुराने संस्करण से मेल नहीं खाता जारी करता है) (वहाँ है कोई नियमित राज्य फ़ाइल)
  • प्रतिकृति के लिए पूर्ण समर्थन सेट
  • स्वचालित संभाल पुनरावर्तन (डेवलपर्स रोलबैक प्रक्रियाओं का उल्लेख करना होगा) multip चलाने के लिए
  • की क्षमता le माइग्रेशन एक ही समय में (सिंक या async) एक ही समय

आशा है कि यह मदद करता है पर विभिन्न डेटाबेस के विरुद्ध माइग्रेशन चलाने के लिए

  • की क्षमता!