Mongoid 7.5
Contents
Mongoid 7.5#
On this page
This page describes significant changes and improvements in Mongoid 7.5. 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.
Ruby, JRuby and Rails Version Support#
Mongoid 7.5 deprecates support for Ruby 2.5, JRuby 9.2 and Rails 5.1. Mongoid 8 will require Ruby 2.6 or newer, JRuby 9.3 or newer and Rails 5.2 or newer.
Feature Flags Summary#
To ensure a stable upgrade path from Mongoid 7.4, Mongoid 7.5 introduces feature flags which are further explained in the sections below.
To enable all new behavior in Mongoid 7.5, please use the following configuration options in your mongoid.yml file. We recommend newly created apps to do this as well.
development:
...
options:
# Enable all new behavior in Mongoid 7.5
legacy_attributes: false
overwrite_chained_operators: false
In addition, please refer to the release notes of earlier 7.x versions for feature flags introduced in each version. For clarity, Mongoid 7.5 does not switch the behavior of any previously introduced feature flag.
Implemented Criteria#take/take! Method#
Mongoid 7.5 introduces the #take method which returns a document
or a set of documents from the database without ordering by _id:
class Band
include Mongoid::Document
end
Band.create!
Band.create!
Band.take
# => #<Band _id: 62c835813282a4470c07d530, >
Band.take(2)
# => [ #<Band _id: 62c835813282a4470c07d530, >, #<Band _id: 62c835823282a4470c07d531, > ]
If a parameter is given to #take, an array of documents is returned. If no parameter is
given, a singular document is returned.
The #take! method functions the same as calling #take without arguments,
but raises an DocumentNotFound error instead of returning nil if no documents
are found.
Band.take!
# => #<Band _id: 62c835813282a4470c07d530, >
Note that the #take/take! methods do not apply a sort to the view before
retrieving the documents from the database, and therefore they may return different
results than the #first and #last methods. #take is equivalent to
calling #first or #last with the { id_sort: :none } option. This
option has been deprecated in Mongoid 7.5 and it is recommended to use #take
instead going forward. Support for the :id_sort option will be dropped in
Mongoid 8.
Force the attributes Method to Always Return a Hash#
Mongoid 7.5 with the Mongoid.legacy_attributes option set to false
will always return a Hash when calling the attributes method.
For example:
class Band
include Mongoid::Document
field :name
end
band = Band.create!(name: "The Rolling Stones")
p band.attributes.class
# => Hash
band = Band.first
p band.attributes.class
# => Hash
In Mongoid 7.4 and earlier, and in 7.5 with the Mongoid.legacy_attributes
option set to true, the attributes method on a document will return a
BSON::Document when retrieving that document from the database, but will
return a Hash when instantiating a new document:
band = Band.create!(name: "The Rolling Stones")
p band.attributes.class
# => Hash
band = Band.first
p band.attributes.class
# => BSON::Document
Deprecate :id_sort Option and Support limit on #first/last#
Mongoid 7.5 deprecates the :id_sort keyword argument for the
Criteria#first and Criteria#last methods. Please use Criteria#take
to retrieve documents without sorting by id.
The first and last methods now take the number of documents to return
as a positional argument, mirroring the functionality of Ruby’s Enumerable
method and ActiveRecord’s first and last methods. Both invocations
(with limit as a positional arguments and with the :id_sort option) remain
supported in Mongoid 7.x, but the :id_sort invocation will be removed in
Mongoid 8.
Band.first
# => #<Band _id: 62c835813282a4470c07d530, >
Band.first(2)
# => [ #<Band _id: 62c835813282a4470c07d530, >, #<Band _id: 62c835823282a4470c07d531, > ]
Band.last
# => #<Band _id: 62c835823282a4470c07d531, >
Band.last(2)
# => [#<Band _id: 62c835813282a4470c07d530, >, #<Band _id: 62c835823282a4470c07d531, >]
When providing a limit, #first/last will return a list of documents, and
when not providing a limit (or providing nil), a single document will be
returned.
Note that the #first/last methods apply a sort on _id, which can
cause performance issues. To get a document without sorting first, use the
Critera#take method.
Combine Chained Operators Using and Instead of override#
Mongoid 7.5 with the Mongoid.overwrite_chained_operators option set to false
will combine conditions that use the same operator and field using an and.
For example, in the following query:
Band.ne(name: "The Rolling Stones").ne(name: "The Beatles")
Mongoid 7.5 with the Mongoid.overwrite_chained_operators option set to false
will generate the following criteria:
#<Mongoid::Criteria
selector: {"name"=>{"$ne"=>"The Rolling Stones"}, "$and"=>[{"name"=>{"$ne"=>"The Beatles"}}]}
options: {}
class: Band
embedded: false>
In Mongoid 7.4 and earlier, and in 7.5 with the Mongoid.overwrite_chained_operators
option set to true, the following criteria would be generated instead which
overwrites the first condition:
#<Mongoid::Criteria
selector: {"name"=>{"$ne"=>"The Beatles"}}
options: {}
class: Band
embedded: false>
The following functions are affected by this change:
eqelem_matchgtgteltltemodnenearnear_sphere
Note
In Mongoid 7.5 with the Mongoid.overwrite_chained_operators option set to
false, nested keys in the generated selector will always be strings,
whereas in Mongoid 7.4 and earlier, and in 7.5 with the
Mongoid.overwrite_chained_operators option set to true, nested keys in
the selector can be strings or symbols, depending on what was passed to the
operator.
pluck Usage of map Deprecated#
Mongoid 7.5 deprecates the usage of map as pluck, as in the following
example:
Band.all.map(:name)
# Equivalent to:
Band.pluck(:name)
This usage will no longer be supported in Mongoid 8, which will not accept
arguments to map.
Mongoid::Criteria cache deprecated#
The ability to cache individual criteria objects has been deprecated in Mongoid 7.5 and will be dropped in Mongoid 8.
In order to get caching functionality, enable the Mongoid QueryCache. See the section on QueryCache for more details.
Array#update_values and Hash#update_values deprecated#
The Array#update_values and Hash#update_values methods are deprecated in
Mongoid 7.5. It is recommended to use ActiveSupport’s transform_values!
method instead.
Document#to_a deprecated#
The Document#to_a method is deprecated in Mongoid 7.5.
update_one Warnings in upsert#
Mongoid 7.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.5 correctly calls replace_one.