การกำหนดค่าการพัฒนา
สิ่งแรกที่คุณจะพบเมื่อเริ่มต้นแอป Rails หลังจากอัปเกรดเป็น Mongoid 5 คือข้อผิดพลาดเกี่ยวกับการกำหนดค่าฐานข้อมูลของคุณไม่ถูกต้อง
การแก้ไขทำได้ง่ายเพียงแค่เปลี่ยน sessions
ถึง clients
:
development:
clients:
default:
database: appsignal_development
hosts:
- localhost:27017
การเปลี่ยนแปลงไดรเวอร์
ใน codebase ของเรา เรา "เลื่อนลงไปที่ไดรเวอร์" เป็นจำนวนมากเพื่อดำเนินการค้นหาโดยตรงบน moped/mongo-ruby-driver แทนที่จะใช้ Mongoid เช่น เพื่อสร้างคอลเลกชันสำหรับแต่ละบัญชี ที่นี่คุณจะต้องเปลี่ยน sessions
ถึง clients
. การเปลี่ยนแปลงอีกอย่างคือ 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
. อีกต่อไป sort เมื่อไม่มีตัวเลือกการเรียงลำดับ เพื่อรับประกันว่าเอกสารเป็นเอกสารฉบับแรกหรือฉบับสุดท้าย เอกสารนั้นจำเป็นต้องมีการจัดเรียงที่ชัดเจน
ซึ่งหมายความว่าทุกที่ที่คุณพึ่งพาการสั่งซื้อ (.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
หมดอายุ AfterSeconds
การเปลี่ยนแปลงที่ไม่ชัดเจนอีกอย่างหนึ่งคือวิธีสร้างดัชนี TTL เราใช้ดัชนี TTL เพื่อล้างข้อมูลลูกค้าโดยอัตโนมัติตามแผน (เช่น หลังจาก 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 แต่เราต้องลบ auth_mech
คีย์ทั้งหมดเข้าด้วยกันเพื่อให้การตั้งค่าใช้งานได้
บทสรุป
แม้ว่ารายการนี้จะค่อนข้างครอบคลุม แต่เราพบว่าการอัปเกรดนั้นค่อนข้างไม่ลำบาก และไดรเวอร์ใหม่ให้ความรู้สึกแข็งแกร่งกว่าไดรเวอร์ Moped รุ่นเก่ามาก