Quelle est la différence entre enregistrer et insérer dans Mongo DB?

149

Quelle est la différence entre enregistrer et insérer dans Mongo DB? les deux se ressemblent

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

db.users.insert({username:"google",password:"google123"})
user2093576
la source
1
fyi save () est désormais obsolète dans pymongo.
Gabriel Fair

Réponses:

147

Enregistrer Vs Insert:

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

save se comporte différemment s'il est passé avec un paramètre "_id".

Pour enregistrer, si le document contient _id, il sera inséré en interrogeant la collection sur le _idchamp, sinon, il insérera.

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 vs mettre à jour :

updatemodifie un document existant correspondant à vos paramètres de requête. S'il n'y a pas de tel document correspondant, c'est quand upsertvient en image.

  • upsert : false : Rien ne se passe quand un tel document n'existe pas
  • upsert : true : Un nouveau document est créé avec un contenu égal aux paramètres de requête et de mise à jour des paramètres

save: N'autorise aucun paramètre de requête. s'il _idexiste et qu'il existe un document correspondant avec le même _id, il le remplace. Lorsqu'aucun _id n'est spécifié / aucun document correspondant, il insère le document en tant que nouveau.

Rahul
la source
8
les deux ont une syntaxe différente. Update prend plusieurs arguments ({condition}, {update to doc}, upsert, multi) alors que save n'accepte qu'un seul argument (_id étant le paramètre de l'argument conditionnel) .update peut accepter n'importe quelle condition mais save a la limitation de condition uniquement sur le Champ _id.
Rahul
1
Depuis la version 2.6, save a un deuxième argument prenant un document exprimant le souci d'écriture. docs.mongodb.org/manual/reference/method/db.collection.save
huggie
79

Considérons ici les deux cas de sauvegarde: -

1) Avoir _id dans le doc.

2) Ne pas avoir _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 ici les deux cas d'insertion: -

1) Avoir _id du doc ​​dans la collection.

2) Ne pas avoir _id du doc ​​dans la collection.

                        Insert()
                       /        \
                      /          \

   Doc Having _id in collection    Doc Not Having _id 
  ->  E11000 duplicate key     ->Insert a new doc inside the collection.
      error index:       
squiroid
la source
10
Diagrammes de niveau suivant
John Spiteri
2
J'ai voté pour le temps nécessaire pour dessiner et présenter les diagrammes avec soin.
fanbondi
36

save insérer ou mettre à jour un document.

insert ne fait qu'une insertion.

Mais dans votre cas, il en fera de même, car le document fourni dans save n'a pas de _idchamp.

Aurélien B
la source
13

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 la pomme précédemment enregistrée

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, la couleur mise à jour 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 identifiant d'objet pour effectuer une mise à jour

Insérez une 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"
}

Ainsi, save agira comme une mise à jour s'il est fourni avec un identifiant d'objet, à condition que l'identifiant d'objet existe déjà, sinon il effectue une insertion.

Abhi
la source
10

Si vous essayez d'utiliser «insérer» avec un ID qui était précédemment utilisé dans la même collection, vous obtiendrez une erreur de clé en double. Si vous utilisez "enregistrer" avec un ID qui est déjà dans la même collection, il sera mis à jour / écrasé.

Si vous cherchez à faire une vraie mise à jour, je vous suggère d'utiliser "mise à jour". La mise à jour ne sera pas écrasée comme le ferait Save si vous enregistrez en utilisant le même ID qui est déjà dans la collection.

Par exemple, vous avez deux champs "x" et "y" et vous voulez conserver les deux mais changer la valeur de "x". Si vous avez choisi la commande «enregistrer» et que vous n'avez pas inclus y avec la valeur précédente ou si vous n'avez pas du tout y dans votre sauvegarde, alors y n'aurait plus la même valeur ou n'y serait plus. Cependant, si vous choisissez de mettre à jour à l'aide de $ set et que vous n'avez inclus que x dans votre instruction de mise à jour, vous n'affecterez pas y.

RoganRicheart
la source
3

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

l'opération de sauvegarde lèvera l'exception comme ci-dessous

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

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

Bravo
la source
db.collection.save()met à jour le document si un document avec le même _id existe déjà dans la base de données. Lorsqu'un document avec le même _id existe déjà dans la base de données, la méthode de sauvegarde remplace complètement le document par le nouveau document. Extrait du livre- Pro MongoDB Development
jack blank
1

En termes d'ORACLE: mongo insert => Oracle insert mongo save => Oracle merge

Jagan
la source
1

db.<collection_name>.save(<Document>) équivaut à la requête InsertOrUpdate.

Alors que, db.<collection_name>.insert(<Document>)équivaut simplement à Insérer une requête.

Vijet Badigannavar
la source