143 votes

Quelle est la difference entre save et insert in Mongo DB?

Quelle est la difference entre save et insert in Mongo DB? les deux ressemble le même

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

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

141voto

rahulroc Points 4165

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

save se comporte différemment si il est transmis avec un "_id" paramètre.

Si le document contient un champ _id, puis la méthode save() effectue un upsert l'interrogation de la collection sur le champ _id:

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

Si un document existe avec le _id valeur, la méthode save() effectue une mise à jour, le remplacement de tous les champs dans l'enregistrement existant avec les champs du document.

36voto

AlphaB Points 1058

save insérer ou mettre à jour un document.

insert ne fait qu'une insertion.

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

13voto

Abhi Points 335

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, apple nous a enregistré, la couleur mise à jour du rouge au 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 obtenu inséré comme il n'est pas d'apple avec le même Id de l'Objet à faire une mise à jour

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

Afin de sauver agira comme une mise à jour si elle est fournie avec un id de l'objet, à condition que l'id de l'objet existe déjà, sinon elle ne l'insertion.

10voto

RoganRicheart Points 21

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

Si vous cherchez à faire une vraie mise à jour, je vous recommande d'utiliser "mise à jour". Mise à jour n'écrase pas dans la façon de Sauver le feriez si vous enregistrez en utilisant le même IDENTIFIANT qui est déjà dans la collection.

Par exemple, vous avez deux champs "x" et "y" et vous voulez garder les deux, mais de modifier 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. Toutefois, si vous avez choisi de mise à jour à l'aide de $et seulement eu x inclus dans votre instruction de mise à jour, vous évitez d'y affecter.

6voto

Adam Comerford Points 9084

Comme vous pouvez le voir ici, la méthode de sauvegarde fera essentiellement une requête ascendante (met à jour si elle trouve la doc, insérer autrement):

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

Insert est juste cela, un insert droit.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X