개발 구성
Mongoid 5로 업그레이드한 후 Rails 앱을 시작할 때 가장 먼저 마주하게 되는 것 중 하나는 데이터베이스 구성이 잘못되었다는 오류입니다.
수정은 간단합니다. sessions
만 변경하면 됩니다. clients
에게 :
development:
clients:
default:
database: appsignal_development
hosts:
- localhost:27017
드라이버 변경
우리의 코드베이스에서는 Mongoid를 사용하는 대신 moped/mongo-ruby-driver에서 직접 쿼리를 실행하기 위해 "드라이버로 드롭다운"합니다. 각 계정에 대한 컬렉션을 생성합니다. 여기서 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
를 추가하지 않습니다. 정렬 옵션이 제공되지 않은 경우 정렬합니다. 문서가 첫 번째 또는 마지막임을 보장하려면 이제 명시적 정렬을 포함해야 합니다.
즉, 주문에 의존하는 모든 위치(.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
찾기 및 수정
Find_and_modify
제거 되었어. 대신 이제 3가지 방법 중에서 선택할 수 있습니다.
find_one_and_update
find_one_and_replace
(편의 방법,find_one_and_update
호출 )find_one_and_delete
ExpireAfterSeconds
더 모호한 변경 사항 중 하나는 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 드라이버보다 훨씬 견고하다는 것을 알았습니다.