web-dev-qa-db-fra.com

Quelle est la différence entre replaceOne () et updateOne () dans MongoDB?

Les opérations en bloc de MongoDB ont deux options:

  1. Bulk.find.updateOne()

    Ajoute une opération de mise à jour de document unique à une liste d'opérations en bloc. L'opération peut remplacer un document existant ou mettre à jour des champs spécifiques dans un document existant.

  2. Bulk.find.replaceOne()

    Ajoute une opération de remplacement de document unique à une liste d'opérations en bloc. Utilisez la méthode Bulk.find() pour spécifier la condition qui détermine le document à remplacer. La méthode Bulk.find.replaceOne() limite le remplacement à un seul document.

Selon la documentation, ces deux méthodes peuvent remplacer un document correspondant. Dois-je comprendre correctement que updateOne() est une méthode plus générale, qui peut soit remplacer le document exactement comme le fait replaceOne(), soit simplement mettre à jour ses champs spécifiques?

39
Mike B.

Avec replaceOne() vous ne pouvez remplacer que le document entier, tandis que updateOne() permet de mettre à jour les champs.

Puisque replaceOne() remplace tout le document - les champs de l'ancien document non contenus dans le nouveau seront perdus. Avec updateOne() de nouveaux champs peuvent être ajoutés sans perdre les champs de l'ancien document.

Par exemple si vous avez le document suivant:

{
   "_id" : ObjectId("0123456789abcdef01234567"),
   "my_test_key3" : 3333
}

En utilisant:

replaceOne({"_id" : ObjectId("0123456789abcdef01234567")}, { "my_test_key4" : 4})

résulte en:

{
   "_id" : ObjectId("0123456789abcdef01234567"),
   "my_test_key4" : 4.0
}

En utilisant:

updateOne({"_id" : ObjectId("0123456789abcdef01234567")}, {$set: { "my_test_key4" : 4}})

résulte en:

{
   "_id" : ObjectId("0123456789abcdef01234567"),
   "my_test_key3" : 3333.0,
   "my_test_key4" : 4.0
}

Notez qu'avec updateOne() vous pouvez utiliser les opérateurs de mise à jour sur les documents.

44
Hughzi

replaceOne() remplace tout le document, tandis que updateOne() permet de mettre à jour ou d'ajouter des champs. Lorsque vous utilisez updateOne(), vous avez également accès aux opérateurs de mise à jour qui peuvent effectuer des mises à jour fiables sur les documents. Par exemple, deux clients peuvent incrémenter "simultanément" une valeur sur le même champ dans le même document et les deux incréments seront capturés, tandis qu'avec un remplacement, l'un peut écraser l'autre et potentiellement perdre l'un des incréments.

Puisque replaceOne() remplace tout le document - les champs de l'ancien document non contenus dans le nouveau seront perdus. Avec updateOne() de nouveaux champs peuvent être ajoutés sans perdre les champs de l'ancien document.

Par exemple si vous avez le document suivant:

{
   "_id" : ObjectId("0123456789abcdef01234567"),

   "my_test_key3" : 3333
}

En utilisant:

replaceOne({"_id" : ObjectId("0123456789abcdef01234567")}, { "my_test_key4" : 4})

résulte en:

{
   "_id" : ObjectId("0123456789abcdef01234567"),
   "my_test_key4" : 4.0
}

En utilisant:

updateOne({"_id" : ObjectId("0123456789abcdef01234567")}, {$set: { "my_test_key4" : 4}})

résulte en:

{
   "_id" : ObjectId("0123456789abcdef01234567"),
   "my_test_key3" : 3333.0,
   "my_test_key4" : 4.0
}
3
Jurgen Strydom

db.collection.replaceOne() fait exactement la même chose que db.collection.updateOne().

La principale différence est que les données de db.collection.replaceOne() en cours de modification devront aller et venir sur le serveur, tandis que db.collection.UpdateOne() ne demandera que les données filtrées et non le document entier!

0
Evangelos