Quelle est la différence entre enregistrer et insérer 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"})
126
demandé sur user2093576 2013-04-25 12:17:10

9 réponses

Enregistrer Vs Insérer :

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

update modifie un document existant correspondant à vos paramètres de requête. S'il n'y a pas de document correspondant, c'est à ce moment que upsert apparaît.

  • upsert : false: rien ne se passe quand aucun tel document existe
  • upsert : true: le nouveau document est créé avec un contenu égal aux paramètres de requête et aux paramètres de mise à jour

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

127
répondu Rahul 2017-03-20 14:29:45

Considérons les deux cas ici pour enregistrer :-

1) ayant _id dans doc.

2) Ne pas avoir _id dans 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) ayant _id de doc dans la collection.

2) Ne pas avoir _id de 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:       
56
répondu squiroid 2015-04-29 01:09:41

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.

32
répondu AlphaB 2013-04-25 08:21:09

, En donnant un exemple

Enregistrer 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 précédemment sauvé apple

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 sauvé A, Couleur mise à jour du rouge au vrai Rouge

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 d'apple avec le même Id D'objet pour faire 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 ID d'objet, à condition que l'ID d'objet existe déjà, sinon il fait un insert.

11
répondu Abhi 2014-10-28 19:54:57

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 est déjà dans la même collection, il sera mis à jour/écrasé.

Si vous cherchez à faire une vraie mise à jour, je suggère d'utiliser "update". Update n'écrasera pas comme Save le ferait si vous enregistrez en utilisant le même ID que celui qui se trouve déjà dans la collection.

Par exemple, vous avez deux champs "x" et "y" et vous vous voulez garder les deux mais changer la valeur de "x". Si vous avez choisi la commande "enregistrer" et ne comporte pas de y avec la valeur précédente ou de ne pas avoir de y dans votre sauvegarde, puis y aurait plus la même valeur ou d'y être. Cependant, si vous choisissez de mettre à jour en utilisant $set et que x n'est inclus que dans votre instruction update, vous n'affecterez pas Y.

10
répondu RoganRicheart 2014-06-12 00:59:11

Comme vous pouvez le voir ici, la méthode save fera essentiellement un upsert (update si elle trouve le doc, insert sinon):

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

Insert est juste cela, un insert droit.

6
répondu Adam Comerford 2013-04-25 08:21:33

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 lancera l'exception comme ci-dessous

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

Et où comme opération d'insertion, va juste remplacer le document.

3
répondu Bravo 2015-03-31 07:42:15

En termes D'ORACLE: Mongo insert = > Oracle insert mongo enregistrer => Oracle fusion

1
répondu Jagan 2014-02-17 12:05:04

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

While, db.<collection_name>.insert(<Document>) est équivalent à simplement insérer une requête.

1
répondu Vijet Badigannavar 2015-12-15 07:11:33