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.
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.
Save()/ \
/ \
Having _id NotHaving _id
->Inthiscase save will do->It will do normal insertion
upsert to insert.Now in thiscase 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()/ \
/ \
DocHaving _id in collection DocNotHaving _id
-> E11000 duplicate key ->Insert a new doc inside the collection.
error index:
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.
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
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.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 quandupsert
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.la source
Considérons ici les deux cas de sauvegarde: -
1) Avoir _id dans le doc.
2) Ne pas avoir _id dans le doc.
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.
la source
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.la source
En donnant un exemple
Sauver une pomme
Enregistrer une pomme avec _id de la pomme précédemment enregistrée
Maintenant, la pomme que nous avons enregistrée a, la couleur mise à jour du rouge au rouge réel
Enregistrer une pomme avec _id
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
Orange est inséré
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.
la source
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.
la source
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.
la source
Considérez le document ci-dessous
si db contient déjà le document avec _id: 1, alors
l'opération de sauvegarde lèvera l'exception comme ci-dessous
et où en tant qu'opération d'insertion, remplacera simplement le document.
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 DevelopmentEn termes d'ORACLE: mongo insert => Oracle insert mongo save => Oracle merge
la source
db.<collection_name>.save(<Document>)
équivaut à la requête InsertOrUpdate.Alors que,
db.<collection_name>.insert(<Document>)
équivaut simplement à Insérer une requête.la source