¿Cuál es la diferencia entre guardar e insertar en Mongo DB?

Respuestas:

147

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 _idcampo, 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 :

updatemodifica un documento existente que coincide con sus parámetros de consulta. Si no existe dicho documento coincidente, es cuando upsertaparece la imagen.

  • upsert : false : No pasa nada cuando no existe dicho documento
  • upsert : true : Se crea un nuevo documento con contenidos iguales a los parámetros de consulta y parámetros de actualización

save: No permite ningún parámetro de consulta. si _idexiste 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.

Rahul
fuente
8
Ambos tienen una sintaxis diferente. La actualización toma múltiples argumentos ({condición}, {actualizar a doc}, upsert, multi) mientras que guardar acepta solo un argumento (_id es el parámetro para el argumento condicional) .update puede aceptar cualquier condición, pero guardar tiene la limitación de condición solo en el _id campo.
Rahul
1
A partir de la versión 2.6, guardar tiene un segundo argumento que toma un documento que expresa la preocupación de escritura. docs.mongodb.org/manual/reference/method/db.collection.save
huggie
79

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:       
squiroid
fuente
10
Diagramas de nivel siguiente
John Spiteri
2
Votaron por el tiempo necesario para dibujar y presentar los diagramas.
fanbondi
36

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 _idcampo.

Aurélien B
fuente
13

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.

Abhi
fuente
10

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.

RoganRicheart
fuente
3

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.

Bravo
fuente
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
jack blank
1

En términos de ORACLE: mongo insert => Oracle insert mongo save => Oracle merge

Jagan
fuente
1

db.<collection_name>.save(<Document>) es equivalente a InsertOrUpdate Query.

Mientras, db.<collection_name>.insert(<Document>)es equivalente a solo Insertar consulta.

Vijet Badigannavar
fuente