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"})
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.
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:
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
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.
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.
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.
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.
En termes D'ORACLE: Mongo insert = > Oracle insert mongo enregistrer => Oracle fusion
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.