Docs Menu
Docs Home
/ / /
Mongoid
/

Mongoid 9.0

項目一覧

このページでは、 Mongoid 9.0の重要な変更点と改善点について説明します。 リリースの完全なリストは GithubでGithub 利用可能です。 JIRA では と 、詳細なリリースノートについては リリースを、バグ修正を含む各リリースで修正された問題の完全なリストについては JIRA のリリースを参照してください。

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 リポジトリ を参照してください 。

Mongoid 9には Ruby 2.7以降、または JRuby 9.4が必要です。 以前のバージョンの Ruby および JRuby はサポートされていません。

Mongoid 9には Rails 6.0以降が必要です。 以前の Rails バージョンはサポートされていません。

非推奨クラスMongoid::Errors::InvalidStorageParentが削除されました。

Mongoid 8 .x 以前では、ユーザーは埋め込みドキュメントのaround_*コールバックを定義できます。 9.0以降では、これらのコールバックは無視され、実行されません。 このようなコールバックが定義されている場合は、コンソールに警告が出力されます。

以前の動作を復元するには、アプリケーションでMongoid.around_embedded_document_callbacksを true に設定します。

注意

埋め込みドキュメントでaround_*コールバックを有効にすることは推奨されません。埋め込みドキュメントが多い場合にSystemStackErrorの例外が発生する可能性があるためです。 MONGOID-5658 を参照してください 詳細については、「 」を参照してください。

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 with Mongo::QueryCache. メソッドMongoid::QueryCache#clear_cacheMongo::QueryCache#clearに置き換える必要があります。 他のすべてのメソッドとサブモジュールは同じ名前です。 詳しくは、ドライバー クエリ キャッシュのドキュメントを参照してください。

  • Object#blank_criteria? メソッドは削除されました(以前は非推奨でした)。

  • Document#as_json :compact オプションが削除されます。 代わりに、返されたHashオブジェクトで`#compactを呼び出してください。

  • 非推奨クラスMongoid::Errors::InvalidStorageParentが削除されました。

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 # => {}

Mongoid が Rails コンソール サンドボックス モードをサポートするようになりました。 Rails コンソールが--sandboxフラグで起動した場合、Mongoid はコンソールを開く前に:defaultクライアントでトランザクションを開始します。 このトランザクションはコミットされません。そのため、 :defaultクライアントを使用してコンソールで実行されたすべてのコマンドは、データベースに永続化しません。

注意

デフォルト以外のクライアントを使用してサンドボックス モードでコマンドを実行すると、これらの変更は通常どおり保持されます。

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"))

インスタンスがロードされたときに.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に変更してください。 さらに、 AttributeNotLoadedMongoid::Errors::MongoidErrorを継承している間に、 ActiveModel::MissingAttributeErrorは継承していないことにも注意してください。

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 のタイプキャストはすでにタイムゾーンを正しく使用していることに注意してください。

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 つの永続化操作を実行するように最適化されています。

埋め込まれたサブドキュメントを更新すると、関係で明示的にtouch: falseを設定しない限り、自動的に親にアクセスするようになりました。

class Address
include Mongoid::Document
include Mongoid::Timestamps
embedded_in :mall, touch: false
end

その他のすべての関連付けでは、デフォルトはtouch: falseのままになります。

Mongoid 8.1は#upsertメソッドに:replaceオプションを追加しました。 このオプションは、既存のドキュメントを更新または置換するかどうかを指定するために使用されました。

Mongoid 9.0は、このフラグのデフォルトをtrue => falseから反転します。

つまり、デフォルトでは、Mongoid 9は既存のドキュメントを更新し、それを置き換えません。

Mongoid 9.0より前では、 _idフィールドのミューテーションは、ドキュメントが最上位か埋め込みか、および更新の実行方法に応じて一貫性のない動作をしていました。 9.0以降、 _idフィールドを変更すると、ドキュメントが以前に保存されていた場合、ドキュメントが保存されるときに例外が発生するようになりました。

Mongoid9.0 には新しい機能フラグimmutable_ids も導入され、デフォルトはtrue になります。

Mongoid::Config.immutable_ids = true

false に設定すると、古い、一貫性のない動作が復元されます。

indexマイクロの次のオプションでエイリアス フィールド名を使用するためのサポートが追加されました。 partial_filter_expressionweightswildcard_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 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 に接続すると、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 は、構成されたタイムゾーンをラップする時間オブジェクト、または標準の 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 を使用して宣言されたスコープもクリアされるようになりました 。

  • StringBigDecimalに展開する場合(つまり、BigDecimal オブジェクトを使用して フィールドをクエリする場合)、Stringmap_big_decimal_to_decimal128 フラグが true に設定されている場合、変換はBSON::Decimal128 ではなくString を返します。 MONGOID- 。5484

  • デフォルト スコープMongoid::Errors::InvalidEstimatedCountCriteriaestimated_document_count MONGOID-4960 のドキュメント クラスで を呼び出すと、 に新しいエラー が作成されました 。

  • Mongoid は、すべてのケースの検証にプライマリ読み取りを使用するようになりました MONGOID-5150

  • ローカライズされたフィールドの翻訳ハッシュでシンボルキーのサポートを追加しました MONGOID-5334

  • インデックス ワイルドカード オプションを追加しました MONGOID-5388

  • map_big_decimal_to_decimal128フラグが falsedemongoizing stringに設定されている場合、:to_d は を実装する数値以外と 以外の値の場合、string BigDecimalMONGOID-5507 ではなく を返します。 。

  • ActiveJob 引数として渡される場合、BSON::ObjectId 値の直列化と逆直列化のサポートを追加しました MONGOID-5611

戻る

Mongoid のアップグレード

項目一覧