Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

Mongoid 5 / mongo-ruby-driver로 업그레이드

개발 구성

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 드라이버보다 훨씬 견고하다는 것을 알았습니다.