MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

मोंगोडब/मोंगोइड के साथ रनटाइम बदलते मॉडल

सामान्य तौर पर रनटाइम पर पुराने दस्तावेज़ों को नए फ़ील्ड के साथ अपडेट करना संभव होना चाहिए। MongoDB में माइग्रेशन की कोई आवश्यकता नहीं है।

हो सकता है कि आप अपने पुराने दस्तावेज़ों को नए फ़ील्ड और डिफ़ॉल्ट मानों के साथ अपडेट करने के लिए रेक कार्य लिखना चाहें।

आप उन नए क्षेत्रों की जाँच करके इन दस्तावेज़ों का पता लगा सकते हैं जिनका डिफ़ॉल्ट रूप से शून्य मान है।

अपडेट करें

आसान शैली:

यदि आप किसी नए फ़ील्ड को डिफ़ॉल्ट मान के साथ परिभाषित करते हैं, तो यह मान हमेशा तब तक उपयोग किया जाना चाहिए जब तक आप एक नया सेट करते हैं:

ऐप/मॉडल/my_model.rb

class MyModel
  include Mongoid::Document
  field :name, type: String
  field :data, type: String
  # NEW FIELD
  field :note, type: String, default: "no note given so far!"
end

यदि आप अपने डेटाबेस को क्वेरी करते हैं तो आपको उन दस्तावेज़ों के लिए अपना डिफ़ॉल्ट मान प्राप्त करना चाहिए जिनमें आपके एक्सटेंशन से पहले यह फ़ील्ड नहीं है:

(रेल कंसोल)

MyModel.first
#=> #<MyModel …other fields…, note: "no note given so far!">

मैंने रूबी 1.9.2 पर एक मौजूदा मोंगोइड के साथ एक ताजा रेल स्टैक के साथ इसका परीक्षण किया - अन्य ढेर के साथ भी काम करना चाहिए।

अधिक जटिल/जटिल शैली:

यदि आपने कोई डिफ़ॉल्ट मान सेट नहीं किया है, तो आपको इस नई फ़ील्ड के लिए शून्य मिलेगा।

ऐप/मॉडल/my_model.rb

class MyModel
  include Mongoid::Document
  field :name, type: String
  field :data, type: String
  # NEW FIELD
  field :note, type: String
end

(रेल कंसोल)

MyModel.first
#=> #<MyModel …other fields…, note: nil>

फिर आप इस उदाहरण की तरह एक रेक कार्य और माइग्रेशन फ़ाइल सेट कर सकते हैं:

lib/कार्य/my_model_migration.rake:

namespace :mymodel do
  desc "MyModel migration task"
  task :migrate => :environment do
    require "./db/migrate.rb"
  end
end

db/migrate.rb:

olds = MyModel.where(note: nil)
# Enumerator of documents without a valid :note field (= nil)
olds.each do |doc|
  doc.note = "(migration) no note given yet"
  # or whatever your desired default value should be
  doc.save! rescue puts "Could not modify doc #{doc.id}/#{doc.name}"
  # the rescue is only a failsafe statement if something goes wrong
end

इस माइग्रेशन को rake mymodel:migrate . के साथ चलाएं ।

यह केवल एक प्रारंभिक बिंदु है और आप इसे एक पूर्ण मोंगोइड माइग्रेशन इंजन तक बढ़ा सकते हैं।

task :migrate => :environment do … आवश्यक है, अन्यथा रेक मॉडल लोड नहीं करेगा।



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. मोंगोडीबी $allElementsTrue

  2. Mongoose का उपयोग करके MongoDB में एक सरणी ('टैग' की) सहेजा जा रहा है

  3. ClusterControl - 2017 से सभी फ़ीचर हाइलाइट्स और सुधार

  4. कॉन्फ़िगरेशन त्रुटि:127.0.0.1:27017 पर सर्वर वायर संस्करण 0 की रिपोर्ट करता है, लेकिन PyMongo के इस संस्करण में कम से कम 2 (MongoDB 2.6) की आवश्यकता होती है।

  5. मोंगोडब से जेड में डेटा प्रदर्शित करने की कोशिश कर रहा है