Mongoid 9.0
項目一覧
- Railsmdb for Mongoid
- Ruby 2.6および JRuby 9.3のサポート 削除
- Rails 5のサポートを削除
- 非推奨クラス
Mongoid::Errors::InvalidStorageParent
が削除されました around_*
埋め込みドキュメントのコールバックは無視されるようになりましたfor_js
メソッドは非推奨です- 非推奨オプションが削除されました
- 削除された非推奨機能
touch
メソッドが変更された状態をクリアするようになりました- Rails コンソールのサンドボックス モード
- 新しいトランザクション API
- 埋め込みドキュメントでは常に親永続コンテキストが使用されます
- クエリに未加工値を渡すためのサポート
- クエリ プロジェクションから省略されたフィールドにアクセスするときに AttributeNotLoaded エラーが発生しました
- 構成されたタイムゾーンを使用してクエリで Date to Time をタイプキャストする
- 埋め込みドキュメントの
`#touch
メソッドはtouch: false
オプションを正しく処理します embedded_in
関連付けのデフォルトが になりましたtouch: true
#upsert
の:replace
オプションのデフォルトを反転しました_id
フィールドの不変性が強制されるようになりました- インデックス オプションでのフィールド エイリアスのサポート
- BSON 5および BSON::Decimal 128フィールド
- MongoDB Atlas による検索インデックス管理
Time.configured
は削除されました- レコードがロード/作成された永続性コンテキストを記憶するようになりました
- バグ修正と改善
このページでは、 Mongoid 9.0の重要な変更点と改善点について説明します。 リリースの完全なリストは GithubでGithub 利用可能です。 JIRA では と 、詳細なリリースノートについては リリースを、バグ修正を含む各リリースで修正された問題の完全なリストについては JIRA のリリースを参照してください。
Railsmdb for Mongoid
Mongoid 9.0のリリースに合わせて、Rails アプリケーションの作成、更新、管理、メンテナンス用の新しいコマンドライン ユーティリティも一般提供されています。
railsmdb
Ruby on Rails 開発者がすでに知っている一般的なジェネレーターを使用して、コマンドラインから MongoDB を操作するのを容易にします。
たとえば、 railsmdb
を使用して新しい Mongoid モデルのスタブを生成できます。
bin/railsmdb generate model person
これにより、 app/models/person.rb
に新しいモデルが作成されます。
class Person include Mongoid::Document include Mongoid::Timestamp end
モデルのフィールドを指定することもできます。
# bin/railsmdb generate model person name:string birth:date class Person include Mongoid::Document include Mongoid::Timestamp field :name, type: String field :birth, type: Date end
--parent
オプションを渡すことで、ジェネレーターに新しいモデルを別のサブクラスにするように指示できます。
# bin/railsmdb generate model student --parent=person class Student < Person include Mongoid::Timestamp end
また、モデル名から推論できるとは別のコレクションにモデルを保存する必要がある場合は、 --collection
を指定できます。
# bin/railsmdb generate model course --collection=classes class Course include Mongoid::Document include Mongoid::Timestamp store_in collection: 'classes' end
詳細については、Github リポジトリ を参照してください 。
Ruby 2.6および JRuby 9.3のサポート 削除
Mongoid 9には Ruby 2.7以降、または JRuby 9.4が必要です。 以前のバージョンの Ruby および JRuby はサポートされていません。
Rails 5のサポートを削除
Mongoid 9には Rails 6.0以降が必要です。 以前の Rails バージョンはサポートされていません。
非推奨クラスMongoid::Errors::InvalidStorageParent
が削除されました
非推奨クラスMongoid::Errors::InvalidStorageParent
が削除されました。
around_*
埋め込みドキュメントのコールバックは無視されるようになりました
Mongoid 8 .x 以前では、ユーザーは埋め込みドキュメントのaround_*
コールバックを定義できます。 9.0以降では、これらのコールバックは無視され、実行されません。 このようなコールバックが定義されている場合は、コンソールに警告が出力されます。
以前の動作を復元するには、アプリケーションでMongoid.around_embedded_document_callbacks
を true に設定します。
注意
埋め込みドキュメントでaround_*
コールバックを有効にすることは推奨されません。埋め込みドキュメントが多い場合にSystemStackError
の例外が発生する可能性があるためです。 MONGOID-5658 を参照してください 詳細については、「 」を参照してください。
for_js
メソッドは非推奨です
for_js
メソッドは非推奨であり、 Mongoid 10.0で削除される予定です。
非推奨オプションが削除されました
重大な変更: Mongoid 9.0で次の構成オプションが削除されます。 アプリからこれらへのすべての参照を削除したことを確認してください。 アップグレードする前にconfig.load_defaults 8.1
を使用していた場合、動作の変更は発生しません。 各オプションの意味については、以前のリリースノートを参照してください。
:use_activesupport_time_zone
:broken_aggregables
:broken_alias_handling
:broken_and
:broken_scoping
:broken_updates
:compare_time_by_ms
:legacy_attributes
:legacy_pluck_distinct
:legacy_triple_equals
:object_id_as_json_oid
:overwrite_chained_operators
さらに、 config.load_defaults
バージョン7.5およびそれ以前のバージョンのサポートは削除されました(少なくとも バージョン8.0を使用する必要があります)。
削除された非推奨機能
重大な変更:次の非推奨機能が削除されました。
Mongoid::QueryCache
モジュールが削除されました。 Please replace any usages 1-for-1 withMongo::QueryCache
. メソッドMongoid::QueryCache#clear_cache
はMongo::QueryCache#clear
に置き換える必要があります。 他のすべてのメソッドとサブモジュールは同じ名前です。 詳しくは、ドライバー クエリ キャッシュのドキュメントを参照してください。Object#blank_criteria?
メソッドは削除されました(以前は非推奨でした)。Document#as_json :compact
オプションが削除されます。 代わりに、返されたHash
オブジェクトで`#compact
を呼び出してください。非推奨クラス
Mongoid::Errors::InvalidStorageParent
が削除されました。
touch
メソッドが変更された状態をクリアするようになりました
Mongoid 8 .x と古いtouch
メソッドでは、変更された状態のモデルが残ります。
# Mongoid 8.x behaviour band = Band.create! band.touch band.changed? # => true band.changes # => {"updated_at"=>[2023-01-30 13:12:57.477191135 UTC, 2023-01-30 13:13:11.482975646 UTC]}
9.0以降、Mongoid はtouch
メソッドを使用した後に変更された状態を正しくクリアするようになりました。
# Mongoid 9.0 behaviour band = Band.create! band.touch band.changed? # => false band.changes # => {}
Rails コンソールのサンドボックス モード
Mongoid が Rails コンソール サンドボックス モードをサポートするようになりました。 Rails コンソールが--sandbox
フラグで起動した場合、Mongoid はコンソールを開く前に:default
クライアントでトランザクションを開始します。 このトランザクションはコミットされません。そのため、 :default
クライアントを使用してコンソールで実行されたすべてのコマンドは、データベースに永続化しません。
注意
デフォルト以外のクライアントを使用してサンドボックス モードでコマンドを実行すると、これらの変更は通常どおり保持されます。
新しいトランザクション API
Mongoid 9.0は、ActiveRecord に触発された新しいトランザクション API を導入しています。
Band.transaction do Band.create(title: 'Led Zeppelin') end band = Band.create(title: 'Deep Purple') band.transaction do band.active = false band.save! end
詳細については、 トランザクションのドキュメントを参照してください。
埋め込みドキュメントでは常に親永続コンテキストが使用されます
Mongoid 8 store_in
以前 Mongoid 9.0では、埋め込みドキュメントではこれらの設定は無視されます。埋め込みドキュメントは、常にその親の永続化コンテキストを使用するようになりました。
クエリに未加工値を渡すためのサポート
クエリの実行時に、 Mongoid::RawValue
ラッパー クラスを使用して Mongoid の型変換ロジックをスキップできるようになりました。 これは、データベース内のレガシー データがフィールド定義とは異なるタイプである場合に便利です。
class Person include Mongoid::Document field :age, type: Integer end # Query for the string "42", not the integer 42 Person.where(age: Mongoid::RawValue("42"))
クエリ プロジェクションから省略されたフィールドにアクセスするときに AttributeNotLoaded エラーが発生しました
インスタンスがロードされたときに.only
または.without
クエリプロジェクション メソッドによって除外されたモデル インスタンスのフィールドにアクセスしようとすると、Mongoid はMongoid::Errors::AttributeNotLoaded
エラーを発生させるようになります。
Band.only(:name).first.label #=> raises Mongoid::Errors::AttributeNotLoaded Band.without(:label).first.label = 'Sub Pop Records' #=> raises Mongoid::Errors::AttributeNotLoaded
Mongoid の以前のバージョンでは、同じ条件でActiveModel::MissingAttributeError
が発生していました。 このクラスの Mongoid 固有の使用状況をコードで確認し、それをMongoid::Errors::AttributeNotLoaded
に変更してください。 さらに、 AttributeNotLoaded
はMongoid::Errors::MongoidError
を継承している間に、 ActiveModel::MissingAttributeError
は継承していないことにも注意してください。
構成されたタイムゾーンを使用してクエリで Date to Time をタイプキャストする
Date 値を使用して Time フィールドをクエリする場合、Mongoid はTime.zone
を正しく考慮して型変換を実行するようになりました。
class Magazine include Mongoid::Document field :published_at, type: Time end Time.zone = 'Asia/Tokyo' Magazine.gte(published_at: Date.parse('2022-09-26')) #=> will return all results on or after Sept 26th, 2022 # at 0:00 in Asia/Tokyo time zone.
Mongoid の以前のバージョンでは、上記のコードではTime.zone
(削除された:use_activesupport_time_zone
設定に関係なく)を無視し、常にシステム タイムゾーンを使用して型変換を実行していました。
Mongoid の以前のバージョンでは、永続化操作中の Date to Time のタイプキャストはすでにタイムゾーンを正しく使用していることに注意してください。
`#touch
埋め込みドキュメントのtouch: false
メソッドは、 オプションを正しく処理します
embedded_in
関係にtouch: false
オプションが設定されている場合、埋め込まれた子ドキュメントで#touch
メソッドを呼び出しても、その親ドキュメントで#touch
は呼び出されません。
class Address include Mongoid::Document include Mongoid::Timestamps embedded_in :mall, touch: false end class Mall include Mongoid::Document include Mongoid::Timestamps embeds_many :addresses end mall = Mall.create! address = mall.addresses.create! address.touch #=> updates address.updated_at but not mall.updated_at
さらに、 #touch
メソッドは、ネストされた埋め込みドキュメントを複数レベルで使用する場合でも、親ドキュメントごとに 1 つの永続化操作を実行するように最適化されています。
embedded_in
関連付けのデフォルトが になりました touch: true
埋め込まれたサブドキュメントを更新すると、関係で明示的にtouch: false
を設定しない限り、自動的に親にアクセスするようになりました。
class Address include Mongoid::Document include Mongoid::Timestamps embedded_in :mall, touch: false end
その他のすべての関連付けでは、デフォルトはtouch: false
のままになります。
:replace
の オプションのデフォルトを反転しました#upsert
Mongoid 8.1は#upsert
メソッドに:replace
オプションを追加しました。 このオプションは、既存のドキュメントを更新または置換するかどうかを指定するために使用されました。
Mongoid 9.0は、このフラグのデフォルトをtrue
=> false
から反転します。
つまり、デフォルトでは、Mongoid 9は既存のドキュメントを更新し、それを置き換えません。
_id
フィールドの不変性が強制されるようになりました
Mongoid 9.0より前では、 _id
フィールドのミューテーションは、ドキュメントが最上位か埋め込みか、および更新の実行方法に応じて一貫性のない動作をしていました。 9.0以降、 _id
フィールドを変更すると、ドキュメントが以前に保存されていた場合、ドキュメントが保存されるときに例外が発生するようになりました。
Mongoid9.0 には新しい機能フラグimmutable_ids
も導入され、デフォルトはtrue
になります。
Mongoid::Config.immutable_ids = true
false に設定すると、古い、一貫性のない動作が復元されます。
インデックス オプションでのフィールド エイリアスのサポート
index
マイクロの次のオプションでエイリアス フィールド名を使用するためのサポートが追加されました。 partial_filter_expression
、 weights
、 wildcard_projection
。
class Person include Mongoid::Document field :a, as: :age index({ age: 1 }, { partial_filter_expression: { age: { '$gte' => 20 } }) end
注意
partial_filter_expression
などのインデックス オプション内のフィールド名エイリアスの展開は、MongoDB サーバー6.0の動作に従って実行されます。 将来のサーバー バージョンでは、これらのオプションの解釈方法が変更される可能性があり、Mongoid の機能はそのような変更をサポートしない可能性があります。
BSON 5および BSON::Decimal 128フィールド
BSON 4またはそれ以前の が存在する場合、BSON::Decimal 128として宣言されたフィールドは BSON::Decimal 128値を返します。 ただし、BSON 5が存在する場合、 BSON::Decimal 128として宣言されたフィールドはデフォルトでビッグDecimal 値を返します。
class Model include Mongoid::Document field :decimal_field, type: BSON::Decimal128 end # under BSON <= 4 Model.first.decimal_field.class #=> BSON::Decimal128 # under BSON >= 5 Model.first.decimal_field.class #=> BigDecimal
BSON 5とともにリテラルの BSON::Decimal 128値が必要な場合は、リテラル BSON::Decimal 128フィールドを許可するように Mongoid に指示できます。
Model.first.decimal_field.class #=> BigDecimal Mongoid.allow_bson5_decimal128 = true Model.first.decimal_field.class #=> BSON::Decimal128
注意
allow_bson5_decimal128
オプションは BSON 5以降でのみ効果があります。 BSON 4以前は 設定を完全に無視します。
MongoDB Atlas による検索インデックス管理
MongoDB Atlas に接続すると、Mongoid は検索インデックスの作成と削除をサポートするようになりました。 Mongoid::SearchIndexable API を使用して、プログラムでこれを実行できます。
class SearchablePerson include Mongoid::Document search_index { ... } # define the search index here end # create the declared search indexes; this returns immediately, but the # search indexes may take several minutes before they are available. SearchablePerson.create_search_indexes # query the available search indexes SearchablePerson.search_indexes.each do |index| # ... end # remove all search indexes from the model's collection SearchablePerson.remove_search_indexes
MongoDB Atlas に接続していない場合、検索インデックスの定義は無視されます。 検索インデックスを作成、列挙、または削除しようとすると、エラーが発生します。
便宜上、使用可能な レイテンシ タスク も利用できます。
# create search indexes for all models; waits for indexes to be created # and shows progress on the terminal. $ rake mongoid:db:create_search_indexes # as above, but returns immediately and lets the indexes be created in the # background $ rake WAIT_FOR_SEARCH_INDEXES=0 mongoid:db:create_search_indexes # removes search indexes from all models $ rake mongoid:db:remove_search_indexes
Time.configured
は削除されました
Time.configured
は、構成されたタイムゾーンをラップする時間オブジェクト、または標準の Ruby Time
クラスのいずれかを返しました。 これにより、タイム ゾーンが設定されていない場合でも、時間値をクエリできます。
Mongoid は、時間値を使用して何もする場合(ドキュメントでタイムスタンプを使用するなど)、タイムゾーンを設定する必要を持つようになりました。 Time.configured
の使用はすべてTime.zone
に置き換える必要があります。
# before: puts Time.configured.now # after: puts Time.zone.now # or, better for finding the current Time specifically: puts Time.current
タイムゾーンを設定しないと、 nil
値に関連するコードにエラーが表示されます。 Rails を使用している場合、デフォルトのタイムゾーンはすでに UTC に設定されています。 Rails を使用していない場合は、次のようにプログラムの開始にタイムゾーンを設定できます。
Time.zone = 'UTC'
これにより、タイム ゾーンは UTC に設定されます。 次のコマンドを実行すると、使用可能なすべてのタイム ゾーン名を表示できます。
$ ruby -ractive_support/values/time_zone \ -e 'puts ActiveSupport::TimeZone::MAPPING.keys'
レコードがロード/作成された永続性コンテキストを記憶するようになりました
次のコードを考えてみましょう。
record = Model.with(collection: 'other_collection') { Model.first } record.update(field: 'value')
Mongoid 9.0より前では、ストレージ オプション(モデルの代替コレクションの指定)がレコードに保存されないため、これにより更新の実行が暗黙で失敗する可能性がありました。 したがって、レコードは「 Other_collection 」から読み込まれますが、更新されると、 は、モデルのデフォルトのコレクション内のドキュメントを検索して更新しようとします。 これを機能させるには、アップデートごとに コレクションを明示的に指定する必要がありました。
Mongoid 9.0以降、明示的なストレージ オプションの下で作成またはロードされたレコードは、それらのオプションを記憶します(名前付きクライアント、別のデータベース、または別のコレクションなど)。
レガシー( 9.0より前) 動作する場合は、次のフラグで有効にできます。
Mongoid.legacy_persistence_context_behavior = true
このフラグは、Mongoid 9ではデフォルトで false に設定されています。
バグ修正と改善
このセクションは、小規模なバグ修正と改善を行います。
.unscoped
メソッドでは、.with_scope
MONGOID-5214 を使用して宣言されたスコープもクリアされるようになりました 。を
String
BigDecimal
に展開する場合(つまり、BigDecimal
オブジェクトを使用して フィールドをクエリする場合)、String
map_big_decimal_to_decimal128
フラグが true に設定されている場合、変換はBSON::Decimal128
ではなくString
を返します。 MONGOID- 。5484デフォルト スコープ
Mongoid::Errors::InvalidEstimatedCountCriteria
がestimated_document_count
MONGOID-4960 のドキュメント クラスで を呼び出すと、 に新しいエラー が作成されました 。Mongoid は、すべてのケースの検証にプライマリ読み取りを使用するようになりました MONGOID-5150 。
ローカライズされたフィールドの翻訳ハッシュでシンボルキーのサポートを追加しました MONGOID-5334 。
インデックス ワイルドカード オプションを追加しました MONGOID-5388 。
map_big_decimal_to_decimal128
フラグが falsedemongoizing
stringに設定されている場合、:to_d
は を実装する数値以外と 以外の値の場合、stringBigDecimal
MONGOID-5507 ではなく を返します。 。ActiveJob 引数として渡される場合、BSON::ObjectId 値の直列化と逆直列化のサポートを追加しました MONGOID-5611 。