Mongoid 7.3
Contents
Mongoid 7.3#
On this page
This page describes significant changes and improvements in Mongoid 7.3. The complete list of releases is available on GitHub and in JIRA; please consult GitHub releases for detailed release notes and JIRA for the complete list of issues fixed in each release, including bug fixes.
delete Method Does Not Trigger Association Dependent Behavior#
Breaking change: In Mongoid 7.3,
dependent behavior is not invoked
when the parent association is deleted using the delete method.
For example, after the following code snippet executes, in Mongoid 7.3 the
album will remain in the database:
class Band
include Mongoid::Document
has_many :albums, dependent: :destroy
end
class Album
include Mongoid::Document
belongs_to :band
end
band = Band.create!
album = Album.create!(band: band)
# Does not delete the album from the database
band.delete
Previous versions of Mongoid invoked dependent behavior when deleting parents.
To invoke dependent behavior, use the destroy method:
# Deletes the album from the database
band.destroy
The behavior of Mongoid 7.3 is consistent with how ActiveRecord behaves.
::Boolean Removed#
Breaking change: Mongoid 7.3 removes the global ::Boolean class.
This change should have no impact on classes that simply use Boolean
fields, as the Boolean class is aliased from Mongoid::Fields
(which is included in Mongoid::Document). The following field definition
continues to work in 7.3 as it did in 7.2:
class User
include Mongoid::Document
field :verified, type: Boolean
end
However, code that is not executed in the context of a class including
Mongoid::Document may need to explicitly qualify Boolean references.
The following snippet fails with Mongoid 7.3 due to Boolean being
unqualified:
class User
include Mongoid::Document
end
User.field :verified, type: Boolean
To fix it, use the fully-qualified Mongoid::Boolean class:
User.field :verified, type: Mongoid::Boolean
Note that class_eval is executed in the scope of the caller, not in
the scope of the class being modified. Thus even when using class_eval
it is necessary to fully qualify Mongoid::Boolean:
User.class_eval do
field :verified, type: Mongoid::Boolean
end
Additionally, in Mongoid 7.2 ::Boolean and Mongoid::Boolean were
different classes. In Mongoid 7.3 there is only one class which is
Mongoid::Boolean.
It is possible to restore the global ::Boolean class by executing in
your application:
Boolean = Mongoid::Boolean
Note that this aliases Mongoid::Boolean to ::Boolean such that there
is still only a single Boolean class:
# With Mongoid 7.3:
Boolean = Mongoid::Boolean
Boolean == Mongoid::Boolean
# => true
# With Mongoid 7.2:
Boolean == Mongoid::Boolean
# => false
Selector Key Stringification#
Minor change: Mongoid now converts symbol keys to string keys in the
Criteria selectors. This applies to operators as well as hash literals.
Mongoid 7.3 behavior:
Band.and(year: {'$in': [2020]})
# =>
# #<Mongoid::Criteria
# selector: {"year"=>{"$in"=>[2020]}}
# options: {}
# class: Band
# embedded: false>
Band.where(tag: {city: 1})
# =>
# #<Mongoid::Criteria
# selector: {"tag"=>{"city"=>1}}
# options: {}
# class: Band
# embedded: false>
Mongoid 7.2 behavior:
Band.and(year: {'$in': [2020]})
# =>
# #<Mongoid::Criteria
# selector: {"year"=>{:$in=>[2020]}}
# options: {}
# class: Band
# embedded: false>
Band.where(tag: {city: 1})
# =>
# #<Mongoid::Criteria
# selector: {"tag"=>{:city=>1}}
# options: {}
# class: Band
# embedded: false>
Condition Combination Using $eq / $regex#
Minor change: when using the where, and, or, and nor methods
on Criteria objects and providing multiple conditions on the same field
in the same argument using the symbol operator syntax, conditions may be
combined using $eq or $regex operators, as appropriate, instead of
$and.
Mongoid 7.3 behavior:
Band.where(year: 2020, :year.gt => 1960)
# =>
# #<Mongoid::Criteria
# selector: {"year"=>{"$eq"=>2020, "$gt"=>1960}}
# options: {}
# class: Band
# embedded: false>
Band.where(name: /A/, :name.ne => 'Astral')
# =>
# #<Mongoid::Criteria
# selector: {"name"=>{"$regex"=>/A/, "$ne"=>"Astral"}}
# options: {}
# class: Band
# embedded: false>
Mongoid 7.2 behavior:
Band.where(year: 2020, :year.gt => 1960)
# =>
# #<Mongoid::Criteria
# selector: {"year"=>2020, "$and"=>[{"year"=>{"$gt"=>1960}}]}
# options: {}
# class: Band
# embedded: false>
Band.where(name: /A/, :name.ne => 'Astral')
# =>
# #<Mongoid::Criteria
# selector: {"name"=>/A/, "$and"=>[{"name"=>{"$ne"=>"Astral"}}]}
# options: {}
# class: Band
# embedded: false>
The $regex operator is used when the value is a regular expression, i.e.
an instance of Regexp or BSON::Regexp::Raw classes.
When using the not method with multiple conditions provided in the same
argument, the conditions are kept together and negated as a group.
Mongoid 7.3 behavior:
Band.not(year: 2020, :year.gt => 1960)
# =>
# #<Mongoid::Criteria
# selector: {"$and"=>[{"$nor"=>[{"year"=>{"$eq"=>2020, "$gt"=>1960}}]}]}
# options: {}
# class: Band
# embedded: false>
Mongoid 7.2 behavior:
Band.not(year: 2020, :year.gt => 1960)
# =>
# #<Mongoid::Criteria
# selector: {"year"=>{"$ne"=>2020}, "$and"=>[{"$nor"=>[{"year"=>{"$gt"=>1960}}]}]}
# options: {}
# class: Band
# embedded: false>
New Embedded Matching Operators#
Mongoid 7.3 adds support for bitwise operators, $comment, $mod and
$type operators when embedded matching.
Unaliasing id Field#
It is now possible to remove the id alias in models,
to make id a regular field.
Mongoid.purge! and Mongoid.truncate take the global overrides into account#
Minor change: Mongoid.purge! and Mongoid.truncate! now consider global
overrides set with Mongoid.override_database and Mongoid.override_client.
Mongoid 7.3 behavior:
Mongoid.override_database("some_other_db")
Band.create!(name: "Garage")
Band.count # => 1
Mongoid.purge! # or Mongoid.truncate!
Band.count # => 0
Mongoid 7.2 behavior:
Mongoid.override_database("some_other_db")
Band.create!(name: "Garage")
Band.count # => 1
Mongoid.purge! # or Mongoid.truncate!
Band.count # => 1
update_one Warnings in upsert#
Mongoid 7.3.5 fixes incorrect usage of the driver’s update_one method from
Mongoid’s upsert method. Mongoid’s upsert actually performs a
replacing upsert, and Mongoid 7.3.5 and later correctly call replace_one.