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"})
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"})
Réponses:
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 _id
champ, 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 :
update
modifie un document existant correspondant à vos paramètres de requête. S'il n'y a pas de tel document correspondant, c'est quand upsert
vient en image.
upsert : false
: Rien ne se passe quand un tel document n'existe pasupsert : true
: Un nouveau document est créé avec un contenu égal aux paramètres de requête et de mise à jour des paramètressave
: N'autorise aucun paramètre de requête. s'il _id
existe 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.
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:
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 _id
champ.
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.
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.
Comme vous pouvez le voir ici, la méthode save fera essentiellement un upsert (mise à jour si elle trouve le document, insérer autrement):
http://docs.mongodb.org/manual/reference/method/db.collection.save/#db.collection.save
L'insert 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
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.
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
db.<collection_name>.save(<Document>)
équivaut à la requête InsertOrUpdate.
Alors que, db.<collection_name>.insert(<Document>)
équivaut simplement à Insérer une requête.