¿Cuál es la diferencia entre guardar e insertar en Mongo DB? ambos se ven iguales
db.users.save({username:"google",password:"google123"})
db.users.insert({username:"google",password:"google123"})
¿Cuál es la diferencia entre guardar e insertar en Mongo DB? ambos se ven iguales
db.users.save({username:"google",password:"google123"})
db.users.insert({username:"google",password:"google123"})
Respuestas:
Guardar Vs Insertar:
En sus ejemplos dados, el comportamiento es esencialmente el mismo.
save
se comporta de manera diferente si se pasa con un parámetro "_id".
Para guardar, si el documento contiene _id
, se mantendrá al consultar la colección en el _id
campo, de lo contrario, se insertará.
Si un documento no existe con el valor _id especificado, el método save () realiza una inserción con los campos especificados en el documento.
Si existe un documento con el valor _id especificado, el método save () realiza una actualización, reemplazando todos los campos del registro existente con los campos del documento.
Guardar vs Actualizar :
update
modifica un documento existente que coincide con sus parámetros de consulta. Si no existe dicho documento coincidente, es cuando upsert
aparece la imagen.
upsert : false
: No pasa nada cuando no existe dicho documentoupsert : true
: Se crea un nuevo documento con contenidos iguales a los parámetros de consulta y parámetros de actualizaciónsave
: No permite ningún parámetro de consulta. si _id
existe y hay un documento coincidente con el mismo _id
, lo reemplaza. Cuando no se especifica _id / ningún documento coincidente, inserta el documento como uno nuevo.
Consideremos los dos casos aquí para ahorrar: -
1) Tener _id en doc.
2) No tener _id en 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.
Consideremos los dos casos aquí para insertar: -
1) Tener _id de doc en la colección.
2) No tener _id de doc en la colección.
Insert()
/ \
/ \
Doc Having _id in collection Doc Not Having _id
-> E11000 duplicate key ->Insert a new doc inside the collection.
error index:
save
insertar o actualizar un documento.
insert
solo hace una inserción.
Pero en su caso, hará lo mismo, ya que el documento proporcionado en guardar no tiene _id
campo.
Dando un ejemplo
Salvar una manzana
db.fruit.save({"name":"apple", "color":"red","shape":"round"})
WriteResult({ "nInserted" : 1 })
db.fruit.find();
{
"_id" : ObjectId("53fa1809132c1f084b005cd0"),
"color" : "red",
"shape" : "round",
"name" : "apple"
}
Guarde una manzana con _id de la manzana guardada anteriormente
db.fruit.save(
{"_id" : ObjectId("53fa1809132c1f084b005cd0"),"name":"apple",
"color":"real red","shape":"round"})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Ahora la manzana que guardamos tiene un color actualizado de rojo a rojo real
db.fruit.find();
{
"_id" : ObjectId("53fa1809132c1f084b005cd0"),
"color" : "real red",
"shape" : "round",
"name" : "apple"
}
Ahorre una manzana con _id
db.fruit.save({"_id" : ObjectId("55551809132c1f084b005cd0"),
"name":"apple", "color":"real red","shape":"round"})
WriteResult({ "nMatched" : 0, "nUpserted" : 1,
"nModified" : 0, "_id": 55551809132c1f084b005cd0 })
Apple se insertó ya que no hay una manzana con el mismo Id. De objeto para hacer una actualización
Insertar una naranja
db.fruit.insert({"name":"orange", "color":"orange","shape":"round"})
WriteResult({ "nInserted" : 1 })
Naranja se inserta
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"
}
Por lo tanto, guardar actuará como una actualización si se suministra con una identificación de objeto, siempre que la identificación del objeto ya exista de otra manera, hace una inserción.
Si intenta utilizar "insertar" con una ID que se utilizó anteriormente en la misma colección, obtendrá un error de clave duplicada. Si usa "guardar" con una ID que ya está en la misma colección, se actualizará / sobrescribirá.
Si está buscando hacer una actualización verdadera, le sugiero que use "actualizar". La actualización no se sobrescribirá de la forma en que lo haría Guardar si está guardando utilizando la misma ID que ya está en la colección.
Por ejemplo, tiene dos campos "x" e "y" y desea mantener ambos pero cambiar el valor de "x". Si elige el comando "guardar" y no incluye y con el valor anterior o no tiene y en absoluto en su guardado, entonces ya no tendría el mismo valor o no estaría allí. Sin embargo, si elige actualizar usando $ set y solo tenía x incluida en su declaración de actualización, no afectaría a y.
Como puede ver aquí, el método de guardado esencialmente hará una actualización (se actualiza si encuentra el documento, inserte lo contrario):
http://docs.mongodb.org/manual/reference/method/db.collection.save/#db.collection.save
Insertar es solo eso, una inserción recta.
Considere el siguiente documento
{ "_id" : 1, "domainName" : "test1.com", "hosting" : "hostgator.com" }
si db ya contiene el documento con _id: 1, entonces
la operación de guardar arrojará la excepción como a continuación
E11000 duplicate key error index ...........
y donde como operación de inserción, simplemente anulará el documento.
db.collection.save()
El método actualiza el documento si ya existe un documento con el mismo _id en la base de datos. Cuando ya existe un documento con el mismo _id en la base de datos, el método de guardar reemplaza completamente el documento con el nuevo documento. Del libro - Pro MongoDB Development
db.<collection_name>.save(<Document>)
es equivalente a InsertOrUpdate Query.
Mientras, db.<collection_name>.insert(<Document>)
es equivalente a solo Insertar consulta.