Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

Mongoid 5へのアップグレード完全ガイド:mongo-ruby-driver移行時の変更点まとめ

開発環境の設定

Mongoid 5にアップグレードした後、Railsアプリを起動すると、最初にデータベース設定が不正であるというエラーに遭遇することになります。

修正は簡単で、sessionsclientsに変更するだけです。

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

ドライバーの変更点

私たちのコードベースでは、Mopedやmongo-ruby-driverに対して直接クエリを実行するために「ドライバーへ直接アクセス」することがよくあります。例えば、アカウントごとにコレクションを作成するケースなどです。ここでもsessionclientに変更する必要があります。

もう一つの変更点として、readは値を直接受け取る代わりに、:modeキーを含むハッシュを受け取るようになりました。

  def create_log_entry_collection
    Mongoid
      .client('default') # 以前は `.session('default')`
      .with(:read => {:mode => :primary}) # 以前は `read: => :primary`
      .database
      .command(:create => 'foo')
  end

Mopedには単一のドキュメントまたはドキュメントの配列を受け取るinsertメソッドがありましたが、新しいmongo-ruby-driverでは2つの別々のメソッドに分かれています。挿入したいドキュメントの数に応じて使い分けてください。

# 変更前
Mongoid.client('default')['foo'].insert(document)
Mongoid.client('default')['foo'].insert([document, document])
 
# 変更後
Mongoid.client('default')['foo'].insert_one(document)
Mongoid.client('default')['foo'].insert_many([document, document])

ソート順序の廃止

新しいドライバーにおける最大の変更点の一つは、デフォルトでドキュメントが_idによってソートされなくなったことです。

ソートオプションが指定されていない場合、firstとlastはもはや_idによるソートを追加しません。ドキュメントが確実に最初または最後であることを保証するには、明示的なソートが必要になりました。

つまり、順序に依存している箇所(.first.last)では、クエリに明示的に_idによるソートを指定する必要があります。

# 変更前
expect( User.first.name ).to eq 'bob'
expect( User.last.name ).to eq 'kelso'
 
# 変更後
expect( User.asc('_id').first.name ).to eq 'bob'
expect( User.asc('_id').last.name  ).to eq 'kelso'
 

コードが以前と同じように動作することを保証するため、_idによるソートを行うデフォルトスコープを追加するconcernを作成しました。

# 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

ExpireAfterSeconds

やや目立たない変更点の一つが、TTLインデックスの作成方法です。私たちはTTLインデックスを使用して、顧客のプランに応じてデータを自動的に削除しています(例:7日後、または1ヶ月後)。

インデックスのオプション名はexpire_after_secondsからexpire_afterに変更されました。

# 変更前
collection.indexes.create_one(
  {:time => 1},
  {:expire_after_seconds => ttl}
)
 
# 変更後
collection.indexes.create_one(
  {:time => 1},
  {:expire_after => ttl}
)

ステージング/本番環境の設定変更

開発環境ではsessionsclientsに変更するだけで済みましたが、ステージング環境や本番環境の設定にはより多くの作業が必要でした。

# 変更前
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
 
# 変更後
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
  • usernameuserに改名され、options配下に移動しました
  • passwordoptions配下に移動しました
  • readmodeというネストされたキーを持つようになりました
  • SSLはネストされたハッシュではなくなり、options直下で設定します
  • レプリカセット構成の場合、設定にreplica_setキーが必要になりました

アップグレードドキュメントによると、MongoDB 2.4と2.6では:plain認証を使用するとされていますが、私たちの環境ではauth_mechキーを完全に削除しないと動作しませんでした。

まとめ

変更点のリストはかなり長くなりましたが、アップグレード自体は比較的スムーズに行えました。また、新しいドライバーは旧Mopedドライバーよりもはるかに堅牢に感じられます。Mongoid 5への移行を検討している方は、本記事の変更点をチェックリストとして活用してみてください。

  1. Windows 11にアップグレードする価値はある?メリット・デメリットを徹底解説

    2021年6月24日、Microsoftは次期OS「Windows 11」を正式発表し、同年のホリデーシーズンに提供を開始すると明らかにしました。新しいWindows 11は、透明感のあるUIからゲーム性能の向上まで、さまざまな新機能とアップグレードをもたらします。 とはいえ、長年使い慣れたWindows 10から新OSへ乗り換えるのは、誰にとっても簡単な決断ではありません。「本当にアップグレードする価値があるのか?」と迷ってしまうのも無理はありません。 この記事では、Windows 11の特徴や性能を客観的な事実に基づいて整理し、特に現状のOSに満足している方がアップグレードすべきかどうかを

  2. Windows 10にデフォルトパスワードは存在する?初期管理者パスワードの真相と忘れた場合の対処法

    多くのデバイスには、特定の機能へアクセスするためのデフォルト(初期)パスワードが設定されています。そのため、「Windows 10にもデフォルトパスワードがあり、それを知れば隠された機能にアクセスできるのでは?」と考えたことがある方も多いのではないでしょうか。 この記事では、Windows 10のデフォルト管理者パスワードが実際に存在するのか、また存在するとすればどうやって見つけるのかについて詳しく解説します。さらに、パスワードを思い出せない場合の解除方法までご紹介しますので、ぜひ最後までご覧ください。 パート1:Windows 10にデフォルトパスワードは存在するのか? パート2:Wind