Skip to content

Commit 6687c07

Browse files
MONGOID-5408 .evolve should support wrapper class (#5448)
Co-authored-by: shields <[email protected]>
1 parent 7f66aa1 commit 6687c07

File tree

2 files changed

+66
-34
lines changed

2 files changed

+66
-34
lines changed

source/reference/queries.txt

Lines changed: 48 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -168,58 +168,45 @@ name, as follows:
168168
# class: Band
169169
# embedded: false>
170170

171-
Embedded Documents
172-
==================
173-
174-
To match values of fields of embedded documents, use the dot notation:
175-
176-
.. code-block:: ruby
177-
178-
Band.where('manager.name' => 'Smith')
179-
# => #<Mongoid::Criteria
180-
# selector: {"manager.name"=>"Smith"}
181-
# options: {}
182-
# class: Band
183-
# embedded: false>
184-
185-
Band.where(:'manager.name'.ne => 'Smith')
186-
# => #<Mongoid::Criteria
187-
# selector: {"manager.name"=>{"$ne"=>"Smith"}}
188-
# options: {}
189-
# class: Band
190-
# embedded: false>
191171

192-
.. note::
172+
Fields
173+
======
193174

194-
Queries always return top-level model instances, even if all of the
195-
conditions are referencing embedded documents.
196-
197-
Field Types
198-
===========
175+
Querying on Defined Fields
176+
--------------------------
199177

200178
In order to query on a field, it is not necessary to add the field to
201179
:ref:`the model class definition <fields>`. However, if a field is defined in
202-
the model class, the type of the field is taken into account when constructing
203-
the query:
180+
the model class, Mongoid will coerce query values to match defined field types
181+
when constructing the query:
204182

205183
.. code-block:: ruby
206184

207-
Band.where(name: 2020)
185+
Band.where(name: 2020, founded: "2020")
208186
# => #<Mongoid::Criteria
209-
# selector: {"name"=>"2020"}
187+
# selector: {"name"=>"2020", "founded"=>2020}
210188
# options: {}
211189
# class: Band
212190
# embedded: false>
213191

214-
Band.where(founded: 2020)
192+
Querying for Raw Values
193+
-----------------------
194+
195+
If you'd like to bypass Mongoid's query type coercion behavior and query
196+
directly for the raw-typed value in the database, wrap the query value in
197+
``Mongoid::RawValue`` class. This can be useful when working with legacy data.
198+
199+
.. code-block:: ruby
200+
201+
Band.where(founded: Mongoid::RawValue("2020"))
215202
# => #<Mongoid::Criteria
216-
# selector: {"founded"=>2020}
203+
# selector: {"founded"=>"2020"}
217204
# options: {}
218205
# class: Band
219206
# embedded: false>
220207

221-
Aliases
222-
=======
208+
Field Aliases
209+
-------------
223210

224211
Queries take into account :ref:`storage field names <storage-field-names>`
225212
and :ref:`field aliases <field-aliases>`:
@@ -245,6 +232,33 @@ Since ``id`` and ``_id`` fields are aliases, either one can be used for queries:
245232
# embedded: false>
246233

247234

235+
Embedded Documents
236+
==================
237+
238+
To match values of fields of embedded documents, use the dot notation:
239+
240+
.. code-block:: ruby
241+
242+
Band.where('manager.name' => 'Smith')
243+
# => #<Mongoid::Criteria
244+
# selector: {"manager.name"=>"Smith"}
245+
# options: {}
246+
# class: Band
247+
# embedded: false>
248+
249+
Band.where(:'manager.name'.ne => 'Smith')
250+
# => #<Mongoid::Criteria
251+
# selector: {"manager.name"=>{"$ne"=>"Smith"}}
252+
# options: {}
253+
# class: Band
254+
# embedded: false>
255+
256+
.. note::
257+
258+
Queries always return top-level model instances, even if all of the
259+
conditions are referencing embedded documents.
260+
261+
248262
.. _logical-operations:
249263

250264
Logical Operations

source/release-notes/mongoid-9.0.txt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,24 @@ ignored for embedded documents; an embedded document now always uses the persist
8282
context of its parent.
8383

8484

85+
Support for Passing Raw Values into Queries
86+
-------------------------------------------
87+
88+
When performing queries, it is now possible skip Mongoid's type coercion logic
89+
using the ``Mongoid::RawValue`` wrapper class. This can be useful when legacy
90+
data in the database is of a different type than the field definition.
91+
92+
.. code-block:: ruby
93+
94+
class Person
95+
include Mongoid::Document
96+
field :age, type: Integer
97+
end
98+
99+
# Query for the string "42", not the integer 42
100+
Person.where(age: Mongoid::RawValue("42"))
101+
102+
85103
Raise AttributeNotLoaded error when accessing fields omitted from query projection
86104
----------------------------------------------------------------------------------
87105

0 commit comments

Comments
 (0)