Quelle est la différence entre save et insert dans Mongo DB?

Quelle est la différence entre save et insert dans Mongo DB? les deux se ressemblent

db.users.save({username:"google",password:"google123"}) db.users.insert({username:"google",password:"google123"}) 

Enregistrer Vs Insérer:

Dans vos exemples donnés, le comportement est essentiellement le même.

save se comporte différemment si elle est passée avec un paramètre “_id”.

Pour enregistrer, si le document contient _id , il va interroger la collection sur le champ _id , sinon, il va insérer.

Si un document n’existe pas avec la valeur _id spécifiée, la méthode save () effectue une insertion avec les champs spécifiés dans le document.

Si un document existe avec la valeur _id spécifiée, la méthode save () effectue une mise à jour en remplaçant tous les champs de l’enregistrement existant par les champs du document.


Enregistrer contre mise à jour :

update modifie un document existant correspondant à vos parameters de requête. S’il n’y a pas de document correspondant, c’est à ce moment-là upsert image.

  • upsert : false : rien ne se passe quand aucun document n’existe
  • upsert : true : un nouveau document est créé avec un contenu égal aux parameters de requête et aux parameters de mise à jour

save : N’autorise aucune requête-param. si _id existe et qu’il existe un document correspondant avec le même _id , il le remplace. Si aucun document _id spécifié / aucun correspondant n’est inséré, il insère le document comme nouveau.

Considérons les deux cas ici pour sauver: –

1) Avoir _id dans le doc.

2) Ne pas avoir d’id dans le doc.

  Save () / \ / \ Having _id Not Having _id ->In this case save will do -> It will do normal insertion upsert to insert.Now in this case as insert() do. what that means, it means take the document and replace the complete document having same _id. 

Considérons les deux cas ici pour insérer: –

1) Avoir du doc ​​en collection.

2) Ne pas avoir d’id de doc en collection.

  Insert() / \ / \ Doc Having _id in collection Doc Not Having _id -> E11000 duplicate key ->Insert a new doc inside the collection. error index: 

save insérer ou mettre à jour un document.

insert ne fait qu’une insertion.

Mais dans votre cas, il fera de même, car le document fourni dans save n’a pas de champ _id .

En donnant un exemple

Sauver une pomme

 db.fruit.save({"name":"apple", "color":"red","shape":"round"}) WriteResult({ "nInserted" : 1 }) db.fruit.find(); { "_id" : ObjectId("53fa1809132c1f084b005cd0"), "color" : "red", "shape" : "round", "name" : "apple" } 

Enregistrer une pomme avec _id de apple précédemment enregistré

 db.fruit.save( {"_id" : ObjectId("53fa1809132c1f084b005cd0"),"name":"apple", "color":"real red","shape":"round"}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) 

Maintenant, la pomme que nous avons enregistrée a changé de couleur du rouge au rouge réel

 db.fruit.find(); { "_id" : ObjectId("53fa1809132c1f084b005cd0"), "color" : "real red", "shape" : "round", "name" : "apple" } 

Enregistrer une pomme avec _id

 db.fruit.save({"_id" : ObjectId("55551809132c1f084b005cd0"), "name":"apple", "color":"real red","shape":"round"}) WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id": 55551809132c1f084b005cd0 }) 

Apple a été inséré car il n’y a pas de pomme avec le même ID d’object pour effectuer une mise à jour

Insérer un orange

 db.fruit.insert({"name":"orange", "color":"orange","shape":"round"}) WriteResult({ "nInserted" : 1 }) 

Orange est inséré

 db.fruit.find(); { "_id" : ObjectId("53fa1809132c1f084b005cd0"), "color" : "real red", "shape" : "round", "name" : "apple" } { "_id" : ObjectId("53fa196d132c1f084b005cd7"), "color" : "orange", "shape" : "round", "name" : "orange" } { "_id" : ObjectId("55551809132c1f084b005cd0"), "color" : "real red", "shape" : "round", "name" : "apple" } 

Donc, save agira comme une mise à jour si elle est fournie avec un identifiant d’object, à condition que l’identifiant de l’object existe déjà autrement, il effectue une insertion.

Si vous essayez d’utiliser “insert” avec un ID précédemment utilisé dans la même collection, vous obtiendrez une erreur de clé en double. Si vous utilisez “save” avec un ID qui se trouve déjà dans la même collection, il sera mis à jour / écrasé.

Si vous cherchez à faire une mise à jour, je vous suggère d’utiliser “update”. La mise à jour ne sera pas écrasée de la façon suivante: si vous enregistrez en utilisant le même identifiant que celui figurant dans la collection.

Par exemple, vous avez deux champs “x” et “y” et vous voulez conserver les deux, mais changez la valeur de “x”. Si vous avez choisi la commande “save” et que vous n’avez pas inclus y avec la valeur précédente ou que vous n’avez pas du tout y, alors y n’aura plus la même valeur ou ne sera plus là. Cependant, si vous avez choisi de mettre à jour à l’aide de $ set et que x seulement était inclus dans votre instruction de mise à jour, vous n’affecteriez pas y.

Comme vous pouvez le voir ici, la méthode save effectuera essentiellement une mise à jour (mise à jour si elle trouve la doc, insérer autrement):

http://docs.mongodb.org/manual/reference/method/db.collection.save/#db.collection.save

L’insertion est juste ça, un insert droit.

Considérez le document ci-dessous

 { "_id" : 1, "domainName" : "test1.com", "hosting" : "hostgator.com" } 

si db contient déjà le document avec _id: 1, alors

opération de sauvegarde jettera l’exception comme ci-dessous

 E11000 duplicate key error index ........... 

et où en tant qu’opération d’insertion, remplacera simplement le document.

En termes d’ORACLE: mongo insert => Oracle insert mongo save => Oracle fusion

db..save() est équivalente à la requête InsertOrUpdate.

While, db..insert() équivaut à insérer simplement une requête.