Docs Menu

新機能

項目一覧

次の新機能をご覧ください。

リリースと詳細なリリースノートの一覧を表示するには、 Githubの Mongoid リリース を参照してください。

9.0 リリースには、次の新機能、改善点、修正が含まれています。

Mongoid v9.0 のリリースに加えて、 Rails アプリケーションの作成、更新、管理、メンテナンス用コマンドライン ユーティリティ、railsmdb が一般提供されています。

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

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

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

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

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

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

注意

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

for_js メソッドは非推奨であり、Mongoid v10.0 で削除される予定です。

重大な変更: Mongoid v で次の構成オプションが削除されます。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

さらに、v7.5 以前のバージョンの config.load_defaults のサポートは削除されました(少なくとも v8.0 のバージョンを使用する必要があります)。

重大な変更:次の非推奨機能が削除されました。

  • Mongoid::QueryCache モジュールが削除されました。 1 の 1 の使用を Mongo::QueryCache に置き換えてください。 メソッド Mongoid::QueryCache#clear_cacheMongo::QueryCache#clear に置き換える必要があります。 他のすべてのメソッドとサブモジュールは同じ名前です。

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

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

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

Mongoid v8.x 以前では、touch メソッドは変更された状態のモデルを残ります。

# v8.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]}

v9.0 以降、 Mongoid は、touch メソッドを使用して変更された状態を正しくクリアするようになりました。

# v9.0 behavior
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 v8.x 以前では、ユーザーは埋め込みドキュメントの永続性コンテキストを指定できます(store_in マイクロを使用)。 Mongoid v9.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 バージョンでは、永続化操作中に DateTime にタイプキャストする際に、タイムゾーン がすでに正しく使用されていることに注意してください。

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 v8.1 upsert メソッドに :replace オプションを追加しました。 このオプションは、既存のドキュメントを更新または置換するかどうかを指定するために使用されました。

Mongoid v9.0 は、このフラグのデフォルトを true から false に切り替えます。 つまり、デフォルトでは 、Mongoid v9.0 は既存のドキュメントを更新し、それを置き換えません。

Mongoid v9.0 より前は、 _idフィールドをミューテーションすると、ドキュメントが最上位か埋め込みか、および更新の実行方法に応じて動作に一貫性がありませんでした。 v9.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::Decimal128 として宣言されたフィールドはBSON::Decimal128 値を返します。 ただし、 BSON 5 が存在する場合、BSON::Decimal128 として宣言されたフィールドはいずれもデフォルトで BigDecimal 値を返します。

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::Decimal128 値が必要な場合は、Mongoid にリテラル BSON::Decimal128 フィールドを許可するように指示できます。

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 v9.0 より前では、ストレージオプション(モデルの代替コレクションの指定)がレコードに保存されないため、上記のコードは暗黙的に更新を実行できません。 したがって、レコードはother_collection から読み込まれますが、更新されると、 は モデルのデフォルトコレクション内のドキュメントを検索して更新します。 これを機能させるには、アップデートごとにコレクションを明示的に指定する必要がありました。

Mongoid v9.0 以降、 明示的なストレージオプションの下で作成またはロードされたレコードは、それらのオプション( 名前付きクライアント、別のデータベース、または別のコレクションなど)を記憶します。

レガシー(v9.0 以前)が必要な場合 動作する場合は、次のフラグで有効にできます。

Mongoid.legacy_persistence_context_behavior = true

このフラグは、Mongoid v9.0 ではデフォルトで false に設定されています。

項目一覧