Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

อัปเกรดเป็น Mongoid 5 / mongo-ruby-driver

การกำหนดค่าการพัฒนา

สิ่งแรกที่คุณจะพบเมื่อเริ่มต้นแอป 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 รุ่นเก่ามาก