Dans MongoDB, le db.collection.findOneAndReplace()
remplace un seul document en fonction du filtre spécifié.
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.findOneAndReplace()
méthode pour remplacer l'un de ces documents.
db.pets.findOneAndReplace(
{ "type": "Dog" },
{ "name": "Bruno", "type" : "Horse" }
)
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" : "Bruno", "type" : "Horse" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Nous pouvons voir que le premier document a été remplacé par le nouveau document.
Notez que le document de remplacement ne peut pas spécifier un _id
valeur différente de _id
valeur dans le document remplacé.
Renvoyer le document modifié
Par défaut, le document d'origine est renvoyé lorsque vous utilisez db.collection.findOneAndReplace()
.
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.findOneAndReplace(
{ "type": "Dog" },
{ "handle": "Harry", "DOB" : "2020-05-12", "points": 10 },
{ returnNewDocument: true }
)
Résultat :
{ "_id" : 2, "handle" : "Harry", "DOB" : "2020-05-12", "points" : 10 }
Cette fois, l'autre chien a été mis à jour. Dans ce cas, nous avons apporté une modification plus importante, et nous pouvons voir que le document de retour en tient compte.
Nous pouvons vérifier à nouveau la collection pour voir le document remplacé.
db.pets.find()
Résultat :
{ "_id" : 1, "name" : "Bruno", "type" : "Horse" } { "_id" : 2, "handle" : "Harry", "DOB" : "2020-05-12", "points" : 10 } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
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.findOneAndReplace(
{ "_id": 4 },
{ "name": "Fluffy", "type": "Pooch", "DOB" : "2019-12-03", "points": 20 },
{
returnNewDocument: true
}
)
Résultat :
null
Le document n'existait pas dans la collection et donc findOneAndReplace()
a renvoyé null
. Même si nous n'avons pas explicitement 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, "name" : "Bruno", "type" : "Horse" } { "_id" : 2, "handle" : "Harry", "DOB" : "2020-05-12", "points" : 10 } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Exemple utilisant upsert: true
Maintenant, c'est à nouveau, mais cette fois nous spécifions upsert: true
.
db.pets.findOneAndReplace(
{ "_id": 4 },
{ "name": "Fluffy", "type": "Pooch", "DOB" : "2019-12-03", "points": 20 },
{
upsert: true,
returnNewDocument: true
}
)
Résultat :
{ "_id" : 4, "name" : "Fluffy", "type" : "Pooch", "DOB" : "2019-12-03", "points" : 20 }
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" : "Bruno", "type" : "Horse" } { "_id" : 2, "handle" : "Harry", "DOB" : "2020-05-12", "points" : 10 } { "_id" : 3, "name" : "Meow", "type" : "Cat" } { "_id" : 4, "name" : "Fluffy", "type" : "Pooch", "DOB" : "2019-12-03", "points" : 20 }
Nous pouvons donc voir que le nouveau document a bien été mis à jour.
Le sort
Paramètre
Vous pouvez utiliser le sort
paramètre pour spécifier un ordre de tri pour les documents correspondant au filter
.
Lors de l'utilisation du sort
paramètre, une valeur de 1
trie les documents par ordre croissant, et une valeur de -1
les trie par ordre décroissant.
L'argument doit être fourni sous forme de document. Par exemple, { sort: { "salary": 1 } }
trie par le salary
champ par ordre croissant.
Par exemple, supposons que nous créons une collection appelée employees
avec les documents suivants :
db.employees.insertMany([
{ _id: 1, name: "Sandy", salary: 55000 },
{ _id: 2, name: "Sarah", salary: 128000 },
{ _id: 3, name: "Fritz", salary: 25000 },
{ _id: 4, name: "Chris", salary: 45000 },
{ _id: 5, name: "Beck", salary: 82000 }
])
Nous pourrions exécuter le code suivant pour trouver des documents avec un salaire inférieur à 60 000, puis remplacer celui qui est le plus bas parmi ces documents.
db.employees.findOneAndReplace(
{ "salary": { $lt: 60000 } },
{ "name": "Fluffy", "salary": 250000 },
{
sort: { "salary": 1 }
}
)
Résultat :
{ "_id" : 3, "name" : "Fritz", "salary" : 25000 }
Cela montre le document avant sa mise à jour. Comme prévu, l'employé avec le salaire le plus bas a été remplacé par un nouveau salaire (et un nouveau nom).
Voici à quoi ressemblent les documents maintenant.
db.employees.find()
Résultat :
{ "_id" : 1, "name" : "Sandy", "salary" : 55000 } { "_id" : 2, "name" : "Sarah", "salary" : 128000 } { "_id" : 3, "name" : "Fluffy", "salary" : 250000 } { "_id" : 4, "name" : "Chris", "salary" : 45000 } { "_id" : 5, "name" : "Beck", "salary" : 82000 }
On voit donc que Fritz a été remplacé par Fluffy qui a un bien meilleur salaire.
Revenons au document d'origine.
db.employees.remove({})
db.employees.insertMany([
{ _id: 1, name: "Sandy", salary: 55000 },
{ _id: 2, name: "Sarah", salary: 128000 },
{ _id: 3, name: "Fritz", salary: 25000 },
{ _id: 4, name: "Chris", salary: 45000 },
{ _id: 5, name: "Beck", salary: 82000 }
])
Exécutons maintenant le même findOneAndReplace()
code à nouveau, mais cette fois nous allons le trier par ordre décroissant.
db.employees.findOneAndReplace(
{ "salary": { $lt: 60000 } },
{ "name": "Fluffy", "salary": 250000 },
{
sort: { "salary": -1 }
}
)
Résultat :
{ "_id" : 1, "name" : "Sandy", "salary" : 55000 }
Cette fois, Sandy a été remplacée.
Vérifions à nouveau la collection.
db.employees.find()
Résultat :
{ "_id" : 1, "name" : "Fluffy", "salary" : 250000 } { "_id" : 2, "name" : "Sarah", "salary" : 128000 } { "_id" : 3, "name" : "Fritz", "salary" : 25000 } { "_id" : 4, "name" : "Chris", "salary" : 45000 } { "_id" : 5, "name" : "Beck", "salary" : 82000 }
Comme prévu.
Plus d'informations
Le db.collection.findOneAndReplace()
la méthode accepte également d'autres paramètres, tels que projection
(pour spécifier un sous-ensemble de champs à renvoyer), maxTimeMS
, et collation
.
Voir la documentation MongoDB pour db.collections.findOneAndReplace()
pour plus d'informations.