ডেভেলপমেন্ট কনফিগারেশন
Mongoid 5-এ আপগ্রেড করার পর রেইলস অ্যাপ শুরু করার সময় আপনি যে প্রথম সমস্যায় পড়বেন সেটি হলো ডাটাবেস কনফিগারেশন ভুল বলে একটি এরর।
সমাধানটা খুব সহজ, শুধু sessions-কে clients-এ পরিবর্তন করুন:
development: clients: default: database: appsignal_development hosts: - localhost:27017ড্রাইভার পরিবর্তন
আমাদের কোডবেসে আমরা অনেক জায়গায় "ড্রপ ডাউন টু দ ড্রাইভার" করি, অর্থাৎ Mongoid ব্যবহার না করে সরাসরি moped/mongo-ruby-driver-এ কোয়েরি এক্সিকিউট করি, যেমন প্রতিটি একাউন্টের জন্য কালেকশন তৈরি করতে। এখানেও আপনাকে 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') endMoped-এ একটি 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 দিয়ে অর্ডার্ড নয়।
যদি কোনো সর্টিং অপশন না দিয়ে থাকে,
firstএবংlastআর_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 endFindAndModify
Find_and_modify সরিয়ে ফেলা হয়েছে। এর পরিবর্তে এখন আপনার पास ৩টি মেথড আছে:
find_one_and_updatefind_one_and_replace(সুবিধার মেথড,find_one_and_updateকল করে)find_one_and_delete
ExpireAfterSeconds
আরেকটি অপ্রচলিত পরিবর্তন হলো TTL ইন্ডেক্স তৈরির পদ্ধতি। আমরা TTL ইন্ডেক্স ব্যবহার করি কাস্টমার ডেটা অটোমেটিক পার্জ করার জন্য তাদের প্ল্যান অনুযায়ী (যেমন ৭ দিন বা এক মাস পর)।
ইন্ডেক্সে অপশনটি আগে 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: stagingusernameকেuser-এ রিনেম করা হয়েছে এবংoptions-এ সরানো হয়েছেpasswordoptions-এ সরানো হয়েছেreadএখন নেস্টেড কীmodeএক্সপেক্ট করেSSLআর নেস্টেড হ্যাশ নয়, বরংoptions-এর অধীনে সেট করা হয়- যদি সেটআপ রিপ্লিকাসেট হয় তবে কনফিগে
replica_setকী আবশ্যক
আপগ্রেড ডকুমেন্টেশন বলে MongoDB ২.৪ এবং ২.৬ :plain অথেন্টিকেশন ব্যবহার করে, কিন্তু আমাদের কেসে auth_mech কী সম্পূর্ণ সরিয়ে ফেলা লাগলো সেটআপ কাজ করার জন্য।
উপসংহার
যদিও এটি একটি বড় লিস্ট, আমরা আপগ্রেডটিকে tương đối পেইনলেস পেয়েছি এবং নতুন ড্রাইভার পুরনো Moped ড্রাইভার চেয়ে অনেক বেশি স olid লাগছে।