Dans MongoDB, le db.collection.findOneAndUpdate()
la méthode met à jour un seul document en fonction du filter
et sort
critères.
La collection
part est le nom de la collection avec laquelle effectuer l'opération.
Exemple
Supposons que nous ayons une collection appelée pets
qui contient les documents suivants :
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Nous pouvons utiliser le db.collection.findOneAndUpdate()
méthode pour mettre à jour l'un de ces documents.
db.pets.findOneAndUpdate(
{ "type": "Dog" },
{ $set: { "type": "Cow" } }
)
Résultat :
{ "_id" : 1, "name" : "Wag", "type" : "Dog" }
Par défaut, il renvoie le document d'origine (pas la version modifiée).
Notez qu'un seul chien a été mis à jour, même s'il y a deux chiens dans la collection.
Vérifions la collection.
db.pets.find()
Résultat :
{ "_id" : 1, "name" : "Wag", "type" : "Cow" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Nous pouvons voir que le premier document contient maintenant une vache au lieu d'un chien.
Renvoyer le document modifié
Par défaut, le document d'origine est renvoyé lorsque vous utilisez db.collection.findOneAndUpdate()
.
Si vous préférez que le document modifié soit renvoyé à la place, utilisez le returnNewDocument
paramètre.
Faisons une autre modification, mais cette fois nous utiliserons returnNewDocument: true
.
db.pets.findOneAndUpdate(
{ "type": "Dog" },
{ $set: { "type": "Horse" } },
{ returnNewDocument: true }
)
Résultat :
{ "_id" : 2, "name" : "Bark", "type" : "Horse" }
Cette fois, l'autre chien a été mis à jour. Dans ce cas, nous l'avons remplacé par un cheval, et nous pouvons voir que le document de retour le reflète.
Mise à jour
Un upsert est une option que vous pouvez utiliser sur les opérations de mise à jour. Si le document spécifié n'existe pas, un nouveau est inséré. Si c'est le cas existe, alors le document d'origine est mis à jour (et aucun document n'est inséré).
Vous pouvez effectuer des upserts en spécifiant upsert: true
.
Exemple utilisant upsert: false
Tout d'abord, voici un exemple de tentative de mise à jour d'un document inexistant lorsque upsert: false
.
db.pets.findOneAndUpdate(
{ "_id": 4 },
{ $set: { "name": "Barry", "type": "Badger" } },
{
returnNewDocument: true
}
)
Résultat :
null
Le document n'existait pas dans la collection et donc findOneAndUpdate()
a renvoyé null
. Même si nous n'avons pas spécifié upsert: false
, nous savons que c'était faux parce que c'est la valeur par défaut (c'est-à-dire que c'est la valeur qui est utilisée lorsque vous ne spécifiez pas d'option upsert).
Si nous jetons un autre coup d'œil dans la collection, nous pouvons voir que le document n'a pas été mis à jour.
db.pets.find()
Résultat :
{ "_id" : 1, "type" : "Cow" } { "_id" : 2, "name" : "Bark", "type" : "Horse" } { "_id" : 3, "name" : "Scratch", "type" : "Cat" }
Exemple utilisant upsert: true
Maintenant, c'est à nouveau, mais cette fois nous spécifions upsert: true
.
db.pets.findOneAndUpdate(
{ "_id": 4 },
{ $set: { "name": "Barry", "type": "Badger" } },
{
upsert: true,
returnNewDocument: true
}
)
Résultat :
{ "_id" : 4, "name" : "Barry", "type" : "Badger" }
Cette fois, un nouveau document est mis à jour et nous voyons le document mis à jour comme sortie (car nous avons spécifié returnNewDocument: true
).
Vérifions à nouveau la collection.
db.pets.find()
Résultat :
{ "_id" : 1, "name" : "Wag", "type" : "Cow" } { "_id" : 2, "name" : "Bark", "type" : "Horse" } { "_id" : 3, "name" : "Meow", "type" : "Cat" } { "_id" : 4, "name" : "Barry", "type" : "Badger" }
Nous pouvons donc voir que le nouveau document a bien été mis à jour.
Les arrayFilters
Paramètre
Lorsque vous travaillez avec des tableaux, vous pouvez utiliser les arrayFilters
paramètre avec la position $
opérateur pour déterminer les éléments du tableau à mettre à jour. Cela vous permet de mettre à jour un élément de tableau en fonction de sa valeur, même si vous ne connaissez pas sa position.
Par exemple, supposons que nous ayons une collection appelée players
avec les documents suivants :
{ "_id" : 1, "scores" : [ 1, 5, 3 ] } { "_id" : 2, "scores" : [ 8, 17, 18 ] } { "_id" : 3, "scores" : [ 15, 11, 8 ] }
Nous pourrions exécuter la requête suivante pour mettre à jour uniquement les éléments du tableau dont la valeur est supérieure à un certain montant (dans ce cas, 10).
db.players.findOneAndUpdate(
{ scores: { $gte: 10 } },
{ $set: { "scores.$[e]" : 10 } },
{
arrayFilters: [ { "e": { $gte: 10 } } ]
}
)
Résultat :
{ "_id" : 2, "scores" : [ 8, 17, 18 ] }
Cela montre le document avant sa mise à jour. Comme prévu, cela ne met à jour qu'un seul document, même si deux documents correspondent aux critères.
Voici à quoi ressemblent les documents maintenant.
db.players.find()
Résultat :
{ "_id" : 1, "scores" : [ 1, 5, 3 ] } { "_id" : 2, "scores" : [ 8, 10, 10 ] } { "_id" : 3, "scores" : [ 15, 11, 8 ] }
Le document 2 avait deux éléments de tableau mis à jour, car ces éléments correspondaient aux critères.
Plus d'informations
Le db.collection.findOneAndUpdate()
la méthode accepte également d'autres paramètres, tels que projection
(pour spécifier un sous-ensemble de champs à renvoyer), sort
, maxTimeMS
, et collation
.
Voir la documentation MongoDB pour db.collections.findOneAndUpdate()
pour plus d'informations.