Computer >> Máy Tính >  >> Lập trình >> Ruby

Nâng cấp lên Mongoid 5 / mongo-ruby-driver

Cấu hình phát triển

Một trong những điều đầu tiên bạn sẽ gặp phải khi khởi động ứng dụng Rails sau khi nâng cấp lên Mongoid 5 là lỗi cấu hình cơ sở dữ liệu của bạn không chính xác.

Việc khắc phục rất dễ dàng, chỉ cần thay đổi sessions tới clients :

development:
  clients:
    default:
      database: appsignal_development
      hosts:
        - localhost:27017

Thay đổi trình điều khiển

Trong cơ sở mã của chúng tôi, chúng tôi "thả xuống trình điều khiển" rất nhiều để thực hiện các truy vấn trực tiếp trên moped / mongo-ruby-driver, thay vì sử dụng Mongoid, ví dụ:để tạo bộ sưu tập cho từng tài khoản. Tại đây, bạn cũng sẽ cần thay đổi sessions tới máy khách client . Một thay đổi khác là read bây giờ mong đợi một hàm băm với :mode khóa, thay vì giá trị trực tiếp:

  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

Moped có một insert phương thức chấp nhận một tài liệu hoặc một mảng tài liệu. Trình điều khiển mongo-ruby-driver mới đi kèm với hai phương thức riêng biệt và bạn nên chọn một phương thức tùy thuộc vào số lượng tài liệu bạn muốn chèn:

# 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])

Thiếu thứ tự

Một trong những thay đổi lớn nhất với trình điều khiển mới là tài liệu không còn được sắp xếp trên _id theo mặc định.

Đầu tiên và cuối cùng không còn thêm _id sắp xếp khi không có tùy chọn sắp xếp nào được cung cấp. Để đảm bảo rằng một tài liệu là tài liệu đầu tiên hoặc cuối cùng, bây giờ nó cần phải chứa một loại sắp xếp rõ ràng.

Điều này có nghĩa là bất cứ nơi nào bạn đặt hàng dựa vào (.first , .last ) bạn cần phải sắp xếp truy vấn một cách rõ ràng theo _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'
 

Để đảm bảo mã của chúng tôi hoạt động như trước đây, chúng tôi đã tạo ra một mối quan tâm là thêm phạm vi mặc định đặt hàng theo _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 đã bị loại bỏ. Thay vào đó, bây giờ bạn có 3 phương pháp để lựa chọn:

  • find_one_and_update
  • find_one_and_replace (Phương pháp tiện lợi, cuộc gọi find_one_and_update )
  • find_one_and_delete

ExpireAfterSeconds

Một trong những thay đổi ít người biết đến là cách tạo chỉ mục TTL. Chúng tôi sử dụng chỉ mục TTL để tự động xóa dữ liệu khách hàng tùy thuộc vào gói của họ (ví dụ:sau 7 ngày hoặc sau một tháng).

Tùy chọn trên chỉ mục từng được gọi là expire_after_seconds , nhưng đã được đổi tên thành expire_after :

# Before
collection.indexes.create_one(
  {:time => 1},
  {:expire_after_seconds => ttl}
)
 
# After:
collection.indexes.create_one(
  {:time => 1},
  {:expire_after => ttl}
)

Thay đổi cấu hình giai đoạn / Sản xuất

Trong khi phát triển, chúng tôi chỉ cần thay đổi sessions tới clients , nhưng cấu hình dàn / sản xuất của chúng tôi cần nhiều công việc hơn:

# 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 đã được đổi tên thành user và chuyển đến options
  • password đã được chuyển đến options
  • read bây giờ mong đợi một khóa lồng nhau có tên mode
  • SSL không còn là hàm băm lồng nhau nữa mà được đặt trong options
  • Cấu hình yêu cầu replica_set nếu thiết lập là một bản sao

Tài liệu nâng cấp cho biết MongoDB 2.4 và 2.6 sử dụng :plain auth, nhưng chúng tôi cần xóa auth_mech chốt tất cả lại với nhau để thiết lập hoạt động.

Kết luận

Mặc dù đây là một danh sách khá phong phú, chúng tôi nhận thấy việc nâng cấp tương đối dễ dàng và trình điều khiển mới cảm thấy chắc chắn hơn nhiều so với trình điều khiển Moped cũ.