การตั้งค่าสำหรับ Development
หนึ่งในสิ่งแรกที่คุณจะเจอเมื่อเริ่ม Rails app หลังอัปเกรดเป็น Mongoid 5 คือ error เรื่อง database config ไม่ถูกต้อง
แก้ไขง่าย แค่เปลี่ยน sessions เป็น clients:
development: clients: default: database: appsignal_development hosts: - localhost:27017การเปลี่ยนแปลงของ Driver
ในโค้ดเบสของเรา เรา "drop down to the driver" บ่อยครั้ง เพื่อรันคิวรี่โดยตรงบน moped/mongo-ruby-driver แทนที่จะใช้ Mongoid เช่น สร้าง collection สำหรับแต่ละ account ที่นี่คุณต้องเปลี่ยน session เป็น client อีกการเปลี่ยนแปลงคือ read ตอนนี้คาดหวัง hash ที่มี key :mode แทนที่จะเป็นค่าโดยตรง:
def create_log_entry_collection Mongoid .client('default') # เดิมเป็น `.session('default')` .with(:read => {:mode => :primary}) # เดิมเป็น `read: => :primary` .database .command(:create => 'foo') endMoped มีเมธอッド insert ที่รับเอกสารเดี่ยวหรือ array ของเอกสาร Driver mongo-ruby-driver ใหม่มาพร้อม 2 เมธอ็ดแยกกัน และคุณควรเลือกตามจำนวนเอกสารที่ต้องการแทรก:
# ก่อน Mongoid.client('default')['foo'].insert(document) Mongoid.client('default')['foo'].insert([document, document]) # หลัง Mongoid.client('default')['foo'].insert_one(document) Mongoid.client('default')['foo'].insert_many([document, document])การไม่มีการจัดลำดับ
หนึ่งในการเปลี่ยนแปลงใหญ่ที่สุดกับ driver ใหม่คือ เอกสารไม่ได้ถูกจัดลำดับตาม _id โดยค่าเริ่มต้นอีกต่อไป
First และ last ไม่ได้เพิ่มการ sort
_idเมื่อไม่มีตัวเลือกการจัดลำดับให้ ในการรับประกันว่าเอกสารเป็น first หรือ last ต้องมีการ sort เรียบร้อยแล้ว
นี่หมายความว่าทุกที่ที่คุณพึ่งพาการจัดลำดับ (.first, .last) คุณต้องระบุ order โดย _id ให้ชัดเจน:
# ก่อน expect( User.first.name ).to eq 'bob' expect( User.last.name ).to eq 'kelso' # หลัง expect( User.asc('_id').first.name ).to eq 'bob' expect( User.asc('_id').last.name ).to eq 'kelso' เพื่อให้โค้ดทำงานเหมือนเดิม เราสร้าง concern ที่เพิ่ม default scope เรียงตาม _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 ถูกลบออก ตอนนี้คุณมี 3 เมธอ็ดให้เลือก:
find_one_and_updatefind_one_and_replace(Convenience method, เรียกfind_one_and_update)find_one_and_delete
ExpireAfterSeconds
การเปลี่ยนแปลงที่ค่อนข้างซับซ้อนคือวิธีการสร้าง TTL index เราใช้ TTL indexes เพื่อลบข้อมูลลูกค้าอัตโนมัติตามแผนของพวกเขา (เช่น หลัง 7 วัน หรือหลังหนึ่งเดือน)
ตัวเลือกบน index เดิมชื่อ expire_after_seconds แต่เปลี่ยนชื่อเป็น expire_after:
# ก่อน collection.indexes.create_one( {:time => 1}, {:expire_after_seconds => ttl} ) # หลัง: collection.indexes.create_one( {:time => 1}, {:expire_after => ttl} )การเปลี่ยนแปลง Config สำหรับ Staging/Production
ใน development เราแค่ต้องเปลี่ยน sessions เป็น clients แต่ config staging/production ของเราต้องทำงานมากกว่านั้น:
# ก่อน 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 # หลัง 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และย้ายไปoptionspasswordย้ายไปoptionsreadตอนนี้คาดหวัง nested key ชื่อmodeSSLไม่ใช่ nested hash อีกต่อไป แต่ตั้งค่าภายใต้options- Config ต้องการ key
replica_setหาก setup เป็น replicaset
เอกสารอัปเกรดบอกว่า MongoDB 2.4 และ 2.6 ใช้ :plain auth แต่เราต้องลบ key auth_mech ทั้งหมดออกเพื่อให้ setup ทำงาน
สรุป
แม้รายการจะยาว แต่เราพบว่าการอัปเกรดค่อนข้างไม่ลำบาก และ driver ใหม่รู้สึกแข็งแกร่งกว่า driver Moped เก่ามาก