MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

MongoDB findOneAndReplace()

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.