Skip to content

Commit fe9d44b

Browse files
p-mongop
andauthored
Misc docs improvements (#5412)
* Fix list syntax * Add inheritance overview label * Rewrite untyped fields docs * hyperlink remaining field types * tweak atomic prose Co-authored-by: Oleg Pudeyev <[email protected]>
1 parent 94fdc7d commit fe9d44b

File tree

4 files changed

+81
-47
lines changed

4 files changed

+81
-47
lines changed

docs/reference/crud.txt

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -320,15 +320,13 @@ Mongoid provides the following persistence-related attributes:
320320
person.persisted? # => true
321321

322322

323-
324323
Atomic
325324
------
326325

327-
Although Mongoid performs atomic operations under the covers by default,
328-
there may be cases where you want to do this explicitly without persisting
329-
other fields. Mongoid provides support for all of these operations as well.
330-
When executing atomic operations via these methods, callbacks and validations
331-
are not invoked.
326+
Mongoid exposes :manual:`MongoDB update operators </reference/operator/update/>`
327+
as methods on Mongoid documents. When these methods are used, callbacks are
328+
not invoked and validations are not performed. The supported update operators
329+
are:
332330

333331
.. list-table::
334332
:header-rows: 1
@@ -472,6 +470,12 @@ are not invoked.
472470

473471
person.unset(:name)
474472

473+
Note that, because these methods skip validations, it is possible to both
474+
save invalid documents into the database and end up with invalid documents
475+
in the application (which would subsequently fail to save via a ``save``
476+
call due to the failing validations).
477+
478+
475479
.. _atomic-operation-grouping:
476480

477481
Atomic Operation Grouping

docs/reference/fields.txt

Lines changed: 64 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -28,17 +28,14 @@ Field type definitions determine how Mongoid behaves when constructing queries
2828
and retrieving/writing fields from/to the database. Specifically:
2929

3030
1. When assigning values to fields at runtime, the values are converted to the
31-
specified type.
32-
31+
specified type.
3332
2. When persisting data to MongoDB, the data is sent in an appropriate
34-
type, permitting richer data manipulation within MongoDB or by other
35-
tools.
36-
33+
type, permitting richer data manipulation within MongoDB or by other
34+
tools.
3735
3. When querying documents, query parameters are converted to the specified
38-
type before being sent to MongoDB.
39-
36+
type before being sent to MongoDB.
4037
4. When retrieving documents from the database, field values are converted
41-
to the specified type.
38+
to the specified type.
4239

4340
Changing the field definitions in a model class does not alter data already stored in
4441
MongoDB. To update type or contents of fields of existing documents,
@@ -63,25 +60,26 @@ on a person by using the ``field`` macro.
6360
The valid types for fields are as follows:
6461

6562
- ``Array``
66-
- ``BigDecimal``
63+
- ``BSON::Binary``
64+
- :ref:`BigDecimal <field-type-big-decimal>`
6765
- ``Mongoid::Boolean``, which may be specified simply as ``Boolean`` in the
6866
scope of a class which included ``Mongoid::Document``.
69-
- ``Date``
70-
- ``DateTime``
67+
- :ref:`Date <field-type-date>`
68+
- :ref:`DateTime <field-type-date-time>`
7169
- ``Float``
72-
- ``Hash``
70+
- :ref:`Hash <field-type-hash>`
7371
- ``Integer``
72+
- :ref:`Object <untyped-fields>`
7473
- ``BSON::ObjectId``
75-
- ``BSON::Binary``
7674
- ``Range``
77-
- ``Regexp``
75+
- :ref:`Regexp <field-type-regexp>`
7876
- ``Set``
7977
- ``String``
80-
- ``Mongoid::StringifiedSymbol``, which may be specified simply as
81-
``StringifiedSymbol`` in the scope of a class which included
82-
``Mongoid::Document``.
83-
- ``Symbol``
84-
- ``Time``
78+
- :ref:`Mongoid::StringifiedSymbol <field-type-stringified-symbol>`,
79+
which may be specified simply as ``StringifiedSymbol`` in the scope of a
80+
class which included ``Mongoid::Document``.
81+
- :ref:`Symbol <field-type-stringified-symbol>`
82+
- :ref:`Time <field-type-time>`
8583
- ``ActiveSupport::TimeWithZone``
8684

8785
Mongoid also recognizes the string ``"Boolean"`` as an alias for the
@@ -97,34 +95,60 @@ To define custom field types, refer to :ref:`Custom Field Types <custom-field-ty
9795
``BSON::Decimal128`` will return values of type ``BSON::Decimal128`` in
9896
BSON <=4 and values of type ``BigDecimal`` in BSON 5+.
9997

100-
.. _omitting-field-type-definition:
10198

102-
Omitting Field Type Definition
103-
------------------------------
99+
.. _untyped-fields:
104100

105-
If you decide not to specify the type of field with the definition, Mongoid will treat
106-
it as an object and not try to typecast it when sending the values to the database.
107-
This can be advantageous as the lack of attempted conversion will yield a slight
108-
performance gain. However some types are not supported if not defined as fields.
109-
You can safely omit type specifications when:
101+
Untyped Fields
102+
--------------
110103

111-
- You're not using a web front end and values are already properly cast.
112-
- All of your fields are strings.
104+
Not specifying a type for a field is the same as specifying the ``Object``
105+
type. Such fields are untyped:
113106

114107
.. code-block:: ruby
115108

116-
class Person
117-
include Mongoid::Document
118-
field :first_name
119-
field :middle_name
120-
field :last_name
121-
end
109+
class Product
110+
include Mongoid::Document
111+
112+
field :properties
113+
# Equivalent to:
114+
field :properties, type: Object
115+
end
122116

123-
Types that are not supported as dynamic attributes since they cannot be cast are:
117+
An untyped field can store values of any type which is directly serializable
118+
to BSON. This is useful when a field may contain values of different types
119+
(i.e. it is a variant type field), or when the type of values is not known
120+
ahead of time:
124121

125-
- ``Date``
126-
- ``DateTime``
127-
- ``Range``
122+
.. code-block:: ruby
123+
124+
product = Product.new(properties: "color=white,size=large")
125+
product.properties
126+
# => "color=white,size=large"
127+
128+
product = Product.new(properties: {color: "white", size: "large"})
129+
product.properties
130+
# => {:color=>"white", :size=>"large"}
131+
132+
When values are assigned to the field, Mongoid still performs mongoization but
133+
uses the class of the value rather than the field type for mongoization logic.
134+
135+
.. code-block:: ruby
136+
137+
product = Product.new(properties: 0..10)
138+
product.properties
139+
# The range 0..10, mongoized:
140+
# => {"min"=>0, "max"=>10}
141+
142+
When reading data from the database, Mongoid does not perform any type
143+
conversions on untyped fields. For this reason, even though it is possible
144+
to write any BSON-serializable value into an untyped fields, values which
145+
require special handling on the database reading side will generally not work
146+
correctly in an untyped field. Among field types supported by Mongoid,
147+
values of the following types should not be stored in untyped fields:
148+
149+
- ``Date`` (values will be returned as ``Time``)
150+
- ``DateTime`` (values will be returned as ``Time``)
151+
- ``Range`` (values will be returned as ``Hash``)
128152

129153

130154
.. _field-type-stringified-symbol:
@@ -447,7 +471,7 @@ matches strings containing "hello" before a newline, besides strings ending in
447471
This is because the meaning of ``$`` is different between PCRE and Ruby
448472
regular expressions.
449473

450-
.. _bigdecimal-fields:
474+
.. _field-type-big-decimal:
451475

452476
BigDecimal Fields
453477
-----------------

docs/reference/inheritance.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,12 @@ Inheritance
1212
:depth: 2
1313
:class: singlecol
1414

15+
16+
.. _inheritance-overview:
17+
18+
Overview
19+
========
20+
1521
Mongoid supports inheritance in both top level and embedded documents. When
1622
a child document inherits from a parent document, the parent document's
1723
fields, associations, validations and scopes are copied to the child document.

docs/release-notes/mongoid-8.0.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ Mongoid 8 by default (with this feature flag turned on), values assigned to
6969
fields of type ``BigDecimal`` are stored in the database as type
7070
``BSON::Decimal128``. In Mongoid 7 and earlier, and in Mongoid 8 with this
7171
feature flag turned off, values assigned to fields of type ``BigDecimal`` are
72-
stored as Strings. See the section on :ref:`BigDecimal Fields <bigdecimal-fields>`
72+
stored as Strings. See the section on :ref:`BigDecimal Fields <field-type-big-decimal>`
7373
for more details.
7474

7575

0 commit comments

Comments
 (0)