डेवलपमेंट कॉन्फ़िगरेशन
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_update
find_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
. पर ले जाया गयाpassword
options
. पर ले जाया गया हैread
अबmode
. नामक एक नेस्टेड कुंजी की अपेक्षा करता हैSSL
अब नेस्टेड हैश नहीं है, लेकिनoptions
. के अंतर्गत सेट है- कॉन्फ़िगरेशन के लिए एक
replica_set
की आवश्यकता होती है कुंजी अगर सेटअप एक रेप्लिकासेट है
अपग्रेड दस्तावेज कहता है कि MongoDB 2.4 और 2.6 :plain
. का उपयोग करते हैं प्रमाणीकरण, लेकिन हमें auth_mech
. को हटाना होगा सेटअप के काम करने के लिए सभी एक साथ कुंजी।
निष्कर्ष
हालांकि यह काफी विस्तृत सूची है, हमने पाया कि अपग्रेड अपेक्षाकृत दर्द रहित है और नया ड्राइवर पुराने मोपेड ड्राइवर की तुलना में बहुत अधिक ठोस महसूस करता है।