Skip to content

Commit 659b57e

Browse files
jason-price-mongodbjason-price-mongodb
and
jason-price-mongodb
authored
DOCS-14794 exists update (#6100) (#6102)
Co-authored-by: jason-price-mongodb <jshfjghsdfgjsdjh@aolsdjfhkjsdhfkjsdf.com> Co-authored-by: jason-price-mongodb <jshfjghsdfgjsdjh@aolsdjfhkjsdhfkjsdf.com>
1 parent 07ace31 commit 659b57e

File tree

1 file changed

+71
-1
lines changed

1 file changed

+71
-1
lines changed

source/reference/operator/query/exists.txt

Lines changed: 71 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,77 @@ The results consist of those documents that do not contain the field
113113

114114
.. include:: /includes/extracts/4.2-changes-type-0.rst
115115

116+
Use a Sparse Index to Improve ``$exists`` Performance
117+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
118+
119+
The following scenario is not optimal because all of the collection's
120+
documents are examined:
121+
122+
- You use a query to retrieve or count documents, and
123+
- use ``field: { $exists: true }``, and
124+
- the ``field`` has a non-:ref:`sparse index <index-type-sparse>` or
125+
does not have an index.
126+
127+
To improve performance, create a :ref:`sparse index <index-type-sparse>`
128+
on the ``field`` as shown in the following scenario:
129+
130+
#. Create a ``stockSales`` collection:
131+
132+
.. code-block:: javascript
133+
134+
db.stockSales.insertMany( [
135+
{ _id: 0, symbol: "ABC", auditDate: new Date( "2021-05-18T16:12:23Z" ) },
136+
{ _id: 1, symbol: "ABC", auditDate: new Date( "2021-04-21T11:34:45Z" ) },
137+
{ _id: 2, symbol: "DEF", auditDate: new Date( "2021-02-24T15:11:32Z" ) },
138+
{ _id: 3, symbol: "DEF", auditDate: null },
139+
{ _id: 4, symbol: "DEF", auditDate: new Date( "2021-07-13T18:32:54Z" ) },
140+
{ _id: 5, symbol: "XYZ" }
141+
] )
142+
143+
The document with an ``_id`` of:
144+
145+
- ``3`` has a null ``auditDate`` value.
146+
- ``5`` is missing the ``auditDate`` value.
147+
148+
#. Create a :ref:`sparse index <index-type-sparse>` on the
149+
``auditDate`` field:
150+
151+
.. code-block:: javascript
152+
153+
db.getCollection( "stockSales" ).createIndex(
154+
{ auditDate: 1 },
155+
{ name: "auditDateSparseIndex", sparse: true }
156+
)
157+
158+
#. The following example counts the documents where the ``auditDate``
159+
field has a value (including null) and uses the :ref:`sparse index
160+
<index-type-sparse>`:
161+
162+
.. code-block:: javascript
163+
164+
db.stockSales.countDocuments( { auditDate: { $exists: true } } )
165+
166+
The example returns 5. The document that is missing the ``auditDate``
167+
value is not counted.
168+
169+
.. tip::
170+
171+
If you only need documents where the ``field`` has a non-null value,
172+
you:
173+
174+
- Can use ``$ne: null`` instead of ``$exists: true``.
175+
- Do not need a :ref:`sparse index <index-type-sparse>` on the
176+
``field``.
177+
178+
For example, using the ``stockSales`` collection:
179+
180+
.. code-block:: javascript
181+
182+
db.stockSales.countDocuments( { auditDate: { $ne: null } } )
183+
184+
The example returns 4. Documents that are missing the ``auditDate``
185+
value or have a null ``auditDate`` value are not counted.
186+
116187
.. seealso::
117188

118189
:doc:`/tutorial/query-for-null-fields`
119-

0 commit comments

Comments
 (0)