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ọifind_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ànhuser
và chuyển đếnoptions
-
password
đã được chuyển đếnoptions
-
read
bây giờ mong đợi một khóa lồng nhau có tênmode
-
SSL
không còn là hàm băm lồng nhau nữa mà được đặt trongoptions
- 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ũ.