-
Notifications
You must be signed in to change notification settings - Fork 1.7k
/
db.collection.findAndModify.txt
456 lines (297 loc) · 12.4 KB
/
db.collection.findAndModify.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
=============================
db.collection.findAndModify()
=============================
.. default-domain:: mongodb
.. contents:: On this page
:local:
:backlinks: none
:depth: 1
:class: singlecol
.. EDITS to db.collection.findAndModify.txt must be carried over
(possibly w modifications) to the command findAndModify.txt and vice
versa
Definition
----------
.. method:: db.collection.findAndModify(document)
Modifies and returns a single document. By default, the returned
document does not include the modifications made on the update. To
return the document with the modifications made on the update, use
the ``new`` option. The :method:`~db.collection.findAndModify()`
method is a shell helper around the :dbcommand:`findAndModify`
command.
The :method:`~db.collection.findAndModify()` method has the following
form:
.. code-block:: none
db.collection.findAndModify({
query: <document>,
sort: <document>,
remove: <boolean>,
update: <document>,
new: <boolean>,
fields: <document>,
upsert: <boolean>,
bypassDocumentValidation: <boolean>,
writeConcern: <document>,
collation: <document>
});
The :method:`db.collection.findAndModify()` method takes a document
parameter with the following embedded document fields:
.. |operation| replace:: :method:`~db.collection.findAndModify()`
.. list-table::
:header-rows: 1
:widths: 20 20 80
* - Parameter
- Type
- Description
* - ``query``
- document
- Optional. The selection criteria for the modification. The ``query`` field
employs the same :ref:`query selectors <query-selectors>` as used in
the :method:`db.collection.find()` method. Although the query may
match multiple documents, |operation|
**will only select one document to modify**.
If unspecified, defaults to an empty document.
Starting in MongoDB 3.4.23+, the operation errors if the query argument
is not a document.
* - ``sort``
- document
- Optional. Determines which document the operation modifies if the query selects
multiple documents. |operation| modifies
the first document in the sort order specified by this argument.
Starting in MongoDB 3.4.23+, the operation errors if the sort argument is not
a document.
* - ``remove``
- boolean
- Must specify either the ``remove`` or the ``update`` field. Removes
the document specified in the ``query`` field. Set this to ``true``
to remove the selected document . The default is ``false``.
* - ``update``
- document
- Must specify either the ``remove`` or the ``update`` field. Performs
an update of the selected document. The ``update`` field employs the
same :ref:`update operators <update-operators>` or ``field: value``
specifications to modify the selected document.
* - ``new``
- boolean
- Optional. When ``true``, returns the modified document rather than the original.
The |operation| method ignores the
``new`` option for ``remove`` operations. The default is ``false``.
* - ``fields``
- document
- Optional. A subset of fields to return. The ``fields`` document specifies an
inclusion of a field with ``1``, as in: ``fields: { <field1>: 1,
<field2>: 1, ... }``. See :ref:`projection <read-operations-projection>`.
Starting in 3.4.23+, the operation errors if the fields argument is not
a document.
* - ``upsert``
- boolean
- .. include:: /includes/extracts/findAndModify-behavior-method.rst
* - ``bypassDocumentValidation``
- boolean
- Optional. Enables :method:`db.collection.findAndModify` to bypass document validation
during the operation. This lets you update documents that do not
meet the validation requirements.
.. versionadded:: 3.2
* - ``writeConcern``
- document
- Optional. A document expressing the :doc:`write concern </reference/write-concern>`.
Omit to use the default write concern.
.. versionadded:: 3.2
* - ``maxTimeMS``
- integer
- Optional. Specifies a time limit in milliseconds for processing the operation.
* - ``collation``
- document
- Optional.
.. include:: /includes/extracts/collation-option.rst
Return Data
-----------
For remove operations, if the query matches a document,
:method:`~db.collection.findAndModify()` returns the removed document.
If the query does not match a document to remove,
:method:`~db.collection.findAndModify()` returns ``null``.
For update operations, :method:`~db.collection.findAndModify()` returns
one of the following:
.. include:: /includes/extracts/fact-findandmodify-method-return.rst
Behavior
--------
.. _upsert-and-unique-index:
Upsert and Unique Index
~~~~~~~~~~~~~~~~~~~~~~~
When :method:`~db.collection.findAndModify()` includes the ``upsert:
true`` option **and** the query field(s) is not uniquely indexed, the
method could insert a document multiple times in certain circumstances.
In the following example, no document with the name ``Andy`` exists,
and multiple clients issue the following command:
.. code-block:: javascript
db.people.findAndModify({
query: { name: "Andy" },
sort: { rating: 1 },
update: { $inc: { score: 1 } },
upsert: true
})
Then, if these clients' :method:`~db.collection.findAndModify()`
methods finish the ``query`` phase before any command starts the
``modify`` phase, **and** there is no unique index on the ``name``
field, the commands may all perform an upsert, creating
multiple duplicate documents.
To prevent the creation of multiple duplicate documents with the same
name, create a :ref:`unique index <index-type-unique>` on the ``name``
field. With this unique index in place, the multiple methods will
exhibit one of the following behaviors:
- Exactly one :method:`~db.collection.findAndModify()`
successfully inserts a new document.
- Zero or more :method:`~db.collection.findAndModify()` methods
update the newly inserted document.
- Zero or more :method:`~db.collection.findAndModify()` methods fail
when they attempt to insert documents with the same name. If the
method fails due to the unique index constraint violation on the
``name`` field, you can retry the method. Absent a delete of the
document, the retry should not fail.
Sharded Collections
~~~~~~~~~~~~~~~~~~~
When using :dbcommand:`findAndModify` in a :term:`sharded <sharding>`
environment, the ``query`` **must** contain the :term:`shard key` for
all operations against the sharded cluster for the *sharded* collections.
:dbcommand:`findAndModify` operations issued against :binary:`~bin.mongos`
instances for *non-sharded* collections function normally.
Document Validation
~~~~~~~~~~~~~~~~~~~
.. include:: /includes/extracts/bypassDocumentValidation-db.collection.findAndModify.rst
.. _findAndModify-method-and-update:
Comparisons with the ``update`` Method
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. COMMENT |operation| is replaced above
.. |return-object| replace:: the pre-modified version of the document
.. include:: /includes/fact-findAndModify-update-comparison.rst
Examples
--------
Update and Return
~~~~~~~~~~~~~~~~~
The following method updates and returns an existing document in the
people collection where the document matches the query criteria:
.. code-block:: javascript
db.people.findAndModify({
query: { name: "Tom", state: "active", rating: { $gt: 10 } },
sort: { rating: 1 },
update: { $inc: { score: 1 } }
})
This method performs the following actions:
#. The ``query`` finds a document in the ``people`` collection
where the ``name`` field has the value ``Tom``, the ``state``
field has the value ``active`` and the ``rating`` field has a
value :operator:`greater than <$gt>` 10.
#. The ``sort`` orders the results of the query in ascending order.
If multiple documents meet the ``query`` condition, the method
will select for modification the first document as ordered by
this ``sort``.
#. The update :operator:`increments <$inc>` the value of the
``score`` field by 1.
#. The method returns the original (i.e. pre-modification) document
selected for this update:
.. code-block:: javascript
{
"_id" : ObjectId("50f1e2c99beb36a0f45c6453"),
"name" : "Tom",
"state" : "active",
"rating" : 100,
"score" : 5
}
To return the modified document, add the ``new:true`` option to
the method.
If no document matched the ``query`` condition, the method
returns ``null``.
Upsert
~~~~~~
The following method includes the ``upsert: true`` option for the
``update`` operation to either update a matching document or, if no
matching document exists, create a new document:
.. code-block:: javascript
db.people.findAndModify({
query: { name: "Gus", state: "active", rating: 100 },
sort: { rating: 1 },
update: { $inc: { score: 1 } },
upsert: true
})
If the method finds a matching document, the method performs an update.
If the method does **not** find a matching document, the method creates
a new document. Because the method included the ``sort`` option, it
returns an empty document ``{ }`` as the original (pre-modification)
document:
.. code-block:: javascript
{ }
If the method did **not** include a ``sort`` option, the method returns
``null``.
.. code-block:: javascript
null
Return New Document
~~~~~~~~~~~~~~~~~~~
The following method includes both the ``upsert: true`` option and the
``new:true`` option. The method either updates a matching document and
returns the updated document or, if no matching document exists,
inserts a document and returns the newly inserted document in the
``value`` field.
In the following example, no document in the ``people`` collection
matches the ``query`` condition:
.. code-block:: none
db.people.findAndModify({
query: { name: "Pascal", state: "active", rating: 25 },
sort: { rating: 1 },
update: { $inc: { score: 1 } },
upsert: true,
new: true
})
The method returns the newly inserted document:
.. code-block:: javascript
{
"_id" : ObjectId("50f49ad6444c11ac2448a5d6"),
"name" : "Pascal",
"rating" : 25,
"score" : 1,
"state" : "active"
}
.. _findAndModify-wrapper-sorted-remove:
Sort and Remove
~~~~~~~~~~~~~~~
By including a ``sort`` specification on the ``rating`` field, the
following example removes from the ``people`` collection a single
document with the ``state`` value of ``active`` and the lowest
``rating`` among the matching documents:
.. code-block:: javascript
db.people.findAndModify(
{
query: { state: "active" },
sort: { rating: 1 },
remove: true
}
)
The method returns the deleted document:
.. code-block:: javascript
{
"_id" : ObjectId("52fba867ab5fdca1299674ad"),
"name" : "XYZ123",
"score" : 1,
"state" : "active",
"rating" : 3
}
Specify Collation
~~~~~~~~~~~~~~~~~
.. include:: /includes/extracts/collation-versionadded.rst
A collection ``myColl`` has the following documents:
.. code-block:: javascript
{ _id: 1, category: "café", status: "A" }
{ _id: 2, category: "cafe", status: "a" }
{ _id: 3, category: "cafE", status: "a" }
The following operation includes the :ref:`collation <collation>`
option:
.. code-block:: javascript
db.myColl.findAndModify({
query: { category: "cafe", status: "a" },
sort: { category: 1 },
update: { $set: { status: "Updated" } },
collation: { locale: "fr", strength: 1 }
});
The operation returns the following document:
.. code-block:: javascript
{ "_id" : 1, "category" : "café", "status" : "A" }
.. seealso:: :ref:`perform-findAndModify-linearizable-reads`