Mongoid 5へのアップグレード完全ガイド:mongo-ruby-driver移行時の変更点まとめ
開発環境の設定
Mongoid 5にアップグレードした後、Railsアプリを起動すると、最初にデータベース設定が不正であるというエラーに遭遇することになります。
修正は簡単で、sessionsをclientsに変更するだけです。
development:
clients:
default:
database: appsignal_development
hosts:
- localhost:27017ドライバーの変更点
私たちのコードベースでは、Mopedやmongo-ruby-driverに対して直接クエリを実行するために「ドライバーへ直接アクセス」することがよくあります。例えば、アカウントごとにコレクションを作成するケースなどです。ここでもsessionをclientに変更する必要があります。
もう一つの変更点として、readは値を直接受け取る代わりに、:modeキーを含むハッシュを受け取るようになりました。
def create_log_entry_collection
Mongoid
.client('default') # 以前は `.session('default')`
.with(:read => {:mode => :primary}) # 以前は `read: => :primary`
.database
.command(:create => 'foo')
endMopedには単一のドキュメントまたはドキュメントの配列を受け取る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
endFindAndModify
find_and_modifyは削除されました。代わりに以下の3つのメソッドから選択できるようになっています。
find_one_and_updatefind_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}
)ステージング/本番環境の設定変更
開発環境ではsessionsをclientsに変更するだけで済みましたが、ステージング環境や本番環境の設定にはより多くの作業が必要でした。
# 変更前
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: stagingusernameはuserに改名され、options配下に移動しましたpasswordはoptions配下に移動しましたreadはmodeというネストされたキーを持つようになりました- SSLはネストされたハッシュではなくなり、
options直下で設定します - レプリカセット構成の場合、設定に
replica_setキーが必要になりました
アップグレードドキュメントによると、MongoDB 2.4と2.6では:plain認証を使用するとされていますが、私たちの環境ではauth_mechキーを完全に削除しないと動作しませんでした。
まとめ
変更点のリストはかなり長くなりましたが、アップグレード自体は比較的スムーズに行えました。また、新しいドライバーは旧Mopedドライバーよりもはるかに堅牢に感じられます。Mongoid 5への移行を検討している方は、本記事の変更点をチェックリストとして活用してみてください。
-
Windows 11にアップグレードする価値はある?メリット・デメリットを徹底解説
2021年6月24日、Microsoftは次期OS「Windows 11」を正式発表し、同年のホリデーシーズンに提供を開始すると明らかにしました。新しいWindows 11は、透明感のあるUIからゲーム性能の向上まで、さまざまな新機能とアップグレードをもたらします。 とはいえ、長年使い慣れたWindows 10から新OSへ乗り換えるのは、誰にとっても簡単な決断ではありません。「本当にアップグレードする価値があるのか?」と迷ってしまうのも無理はありません。 この記事では、Windows 11の特徴や性能を客観的な事実に基づいて整理し、特に現状のOSに満足している方がアップグレードすべきかどうかを
-
Windows 10にデフォルトパスワードは存在する?初期管理者パスワードの真相と忘れた場合の対処法
多くのデバイスには、特定の機能へアクセスするためのデフォルト(初期)パスワードが設定されています。そのため、「Windows 10にもデフォルトパスワードがあり、それを知れば隠された機能にアクセスできるのでは?」と考えたことがある方も多いのではないでしょうか。 この記事では、Windows 10のデフォルト管理者パスワードが実際に存在するのか、また存在するとすればどうやって見つけるのかについて詳しく解説します。さらに、パスワードを思い出せない場合の解除方法までご紹介しますので、ぜひ最後までご覧ください。 パート1:Windows 10にデフォルトパスワードは存在するのか? パート2:Wind