डेवलपमेंट कॉन्फ़िगरेशन
Mongoid 5 में अपग्रेड करने के बाद अपने Rails ऐप को शुरू करते समय आपको सबसे पहले जो चीजें मिलेंगी, उनमें से एक यह है कि आपके डेटाबेस कॉन्फिगरेशन के गलत होने के बारे में एक त्रुटि है।
समाधान आसान है, बस sessions को बदलें clients . के लिए :
development:
clients:
default:
database: appsignal_development
hosts:
- localhost:27017 चालक परिवर्तन
हमारे कोडबेस में हम मोंगोइड का उपयोग करने के बजाय सीधे मोपेड/मोंगो-रूबी-ड्राइवर पर प्रश्नों को निष्पादित करने के लिए "ड्राइवर को ड्रॉप डाउन" करते हैं, उदा। प्रत्येक खाते के लिए संग्रह बनाने के लिए। यहां आपको session भी बदलना होगा client . के लिए .एक और बदलाव यह है कि read अब एक :mode के साथ हैश की अपेक्षा करता है कुंजी, सीधे मूल्य के बजाय:
def create_log_entry_collection
Mongoid
.client('default') # used to be `.session('default')`
.with(:read => {:mode => :primary}) # used to be `read: => :primary`
.database
.command(:create => 'foo')
end
मोपेड में एक insert है विधि जो या तो एक दस्तावेज़ या दस्तावेज़ों की एक सरणी को स्वीकार करती है। नया mongo-ruby-driver दो अलग-अलग तरीकों के साथ आता है, और आप जितने दस्तावेज़ सम्मिलित करना चाहते हैं, उसके आधार पर आपको एक चुनना चाहिए:
# Before
Mongoid.client('default')['foo'].insert(document)
Mongoid.client('default')['foo'].insert([document, document])
# After
Mongoid.client('default')['foo'].insert_one(document)
Mongoid.client('default')['foo'].insert_many([document, document]) आदेश की कमी
नए ड्राइवर के साथ सबसे बड़े परिवर्तनों में से एक यह है कि दस्तावेज़ अब _id . पर ऑर्डर नहीं किए जाते हैं डिफ़ॉल्ट रूप से।
पहले और आखिरी में अब _id नहीं जोड़ें सॉर्ट करें जब कोई सॉर्टिंग विकल्प प्रदान नहीं किया गया हो। यह सुनिश्चित करने के लिए कि कोई दस्तावेज़ पहला या अंतिम है, उसमें अब एक स्पष्ट प्रकार शामिल होना चाहिए।
इसका मतलब यह है कि जहां कहीं भी आप ऑर्डर करने पर भरोसा करते हैं (.first , .last ) आपको _id . द्वारा क्वेरी को स्पष्ट रूप से ऑर्डर करने की आवश्यकता है :
# Before
expect( User.first.name ).to eq 'bob'
expect( User.last.name ).to eq 'kelso'
# After
expect( User.asc('_id').first.name ).to eq 'bob'
expect( User.asc('_id').last.name ).to eq 'kelso'
यह सुनिश्चित करने के लिए कि हमारा कोड पहले जैसा व्यवहार करता है, हमने एक चिंता पैदा की जो एक डिफ़ॉल्ट दायरा जोड़ता है जो _id द्वारा ऑर्डर करता है :
# concerns/ordered_by_id_asc.rb
module OrderedByIdAsc
extend ActiveSupport::Concern
included do
default_scope -> { asc('_id') }
end
end # models/account.rb
class Account
include Mongoid::Document
include Mongoid::Timestamps
include OrderedByIdAsc
end FindAndModify
Find_and_modify निकाल दिया गया है। इसके बजाय अब आपके पास चुनने के लिए 3 तरीके हैं:
find_one_and_updatefind_one_and_replace(सुविधा विधि, कॉलfind_one_and_update)find_one_and_delete
एक्सपायर आफ्टर सेकेंड्स
अधिक अस्पष्ट परिवर्तनों में से एक है जिस तरह से टीटीएल इंडेक्स बनाया जाता है। हम ग्राहक डेटा को उनकी योजना के आधार पर स्वचालित रूप से शुद्ध करने के लिए टीटीएल इंडेक्स का उपयोग करते हैं (उदाहरण के लिए 7 दिनों के बाद, या एक महीने के बाद)।
इंडेक्स पर विकल्प को expire_after_seconds . कहा जाता था , लेकिन इसका नाम बदलकर expire_after कर दिया गया है :
# Before
collection.indexes.create_one(
{:time => 1},
{:expire_after_seconds => ttl}
)
# After:
collection.indexes.create_one(
{:time => 1},
{:expire_after => ttl}
) स्टेजिंग/प्रोडक्शन कॉन्फिग में बदलाव
विकास के दौरान हमें केवल sessions . को बदलने की आवश्यकता थी clients . के लिए , लेकिन हमारे स्टेजिंग/प्रोडक्शन कॉन्फिग को बहुत अधिक काम करने की आवश्यकता है:
# Before
staging:
sessions:
default:
database: appsignal_main
username: <%= ENV['MONGOID_USERNAME'] %>
password: <%= ENV['MONGOID_PASSWORD'] %>
hosts:
- mongo1.staging:27017
- mongo2.staging:27017
- mongo3.staging:27017
options:
read: :primary
pool_size: {{ mongoid_pool_size }}
ssl:
ca_file: /etc/ssl/certs/root_ca.crt
client_cert: /app/shared/config/mongodb_app.crt
client_key: /app/shared/config/mongodb_app.key
# After
staging:
clients:
default:
database: appsignal_main
hosts:
- mongo1.staging:27017
- mongo2.staging:27017
- mongo3.staging:27017
options:
user: <%= ENV['MONGOID_USERNAME'] %>
password: <%= ENV['MONGOID_PASSWORD'] %>
read:
mode: :primary
max_pool_size: {{ mongoid_pool_size }}
ssl: true
ssl_ca_cert: /etc/ssl/certs/root_ca.crt
ssl_cert: /app/shared/config/mongodb_app.crt
ssl_key: /app/shared/config/mongodb_app.key
replica_set: staging usernameका नाम बदलकरuserकर दिया गया है औरoptions. पर ले जाया गयाpasswordoptions. पर ले जाया गया हैreadअबmode. नामक एक नेस्टेड कुंजी की अपेक्षा करता हैSSLअब नेस्टेड हैश नहीं है, लेकिनoptions. के अंतर्गत सेट है- कॉन्फ़िगरेशन के लिए एक
replica_setकी आवश्यकता होती है कुंजी अगर सेटअप एक रेप्लिकासेट है
अपग्रेड दस्तावेज कहता है कि MongoDB 2.4 और 2.6 :plain . का उपयोग करते हैं प्रमाणीकरण, लेकिन हमें auth_mech . को हटाना होगा सेटअप के काम करने के लिए सभी एक साथ कुंजी।
निष्कर्ष
हालांकि यह काफी विस्तृत सूची है, हमने पाया कि अपग्रेड अपेक्षाकृत दर्द रहित है और नया ड्राइवर पुराने मोपेड ड्राइवर की तुलना में बहुत अधिक ठोस महसूस करता है।