Qual'è la differenza tra save e insert in Mongo DB?


Risposte:


147

Salva Vs Inserisci:

Nei tuoi esempi forniti, il comportamento è essenzialmente lo stesso.

save si comporta diversamente se viene passato con un parametro "_id".

Per salvare, se il documento contiene _id, verrà richiesto di interrogare la raccolta sul _idcampo. In caso contrario, verrà inserito.

Se un documento non esiste con il valore _id specificato, il metodo save () esegue un inserimento con i campi specificati nel documento.

Se esiste un documento con il valore _id specificato, il metodo save () esegue un aggiornamento, sostituendo tutti i campi nel record esistente con i campi del documento.


Salva vs Aggiorna :

updatemodifica un documento esistente abbinato ai parametri della query. Se non esiste un documento di questo tipo, questo è quando upsertviene in foto.

  • upsert : false : Non succede nulla quando non esiste un documento del genere
  • upsert : true : Viene creato un nuovo documento con contenuti uguali a parametri di query e parametri di aggiornamento

save: Non consente alcun parametro di query. se _idesiste e esiste un documento corrispondente con lo stesso _id, lo sostituisce. Quando non viene specificato alcun documento di identificazione / nessun documento corrispondente, inserisce il documento come nuovo.


8
entrambi hanno sintassi diversa. L'aggiornamento accetta più argomenti ({condition}, {update to doc}, upsert, multi) mentre save accetta solo un argomento (_id è il parametro per argomento condizionale). Update può accettare qualsiasi condizione ma save ha la limitazione della condizione solo sul campo _id.
Rahul,

1
A partire dalla versione 2.6, save ha un secondo argomento che prende un documento che esprime preoccupazione per la scrittura. docs.mongodb.org/manual/reference/method/db.collection.save
huggie

79

Consideriamo i due casi qui per salvare: -

1) Avere _id nel doc.

2) Non avendo _id nel 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.

Consideriamo i due casi qui per inserire: -

1) Avere _id di doc nella raccolta.

2) Non avere _id di doc nella raccolta.

                        Insert()
                       /        \
                      /          \

   Doc Having _id in collection    Doc Not Having _id 
  ->  E11000 duplicate key     ->Insert a new doc inside the collection.
      error index:       

10
Diagrammi di livello successivo
John Spiteri,

2
Ha votato per il tempo impiegato per disegnare e presentare ordinatamente i diagrammi.
Fanbondi,

36

save inserire o aggiornare un documento.

insert fa solo un inserimento.

Ma nel tuo caso, farà lo stesso, poiché il documento fornito in save non ha _idcampi.


13

Dando un esempio

Salva una mela

db.fruit.save({"name":"apple", "color":"red","shape":"round"})
WriteResult({ "nInserted" : 1 })

db.fruit.find();

{
    "_id" : ObjectId("53fa1809132c1f084b005cd0"),
    "color" : "red",
    "shape" : "round",
    "name" : "apple"
}

Salva una mela con _id di mela precedentemente salvata

db.fruit.save(
{"_id" : ObjectId("53fa1809132c1f084b005cd0"),"name":"apple", 
"color":"real red","shape":"round"})

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

Ora la mela che abbiamo salvato ha, il colore aggiornato dal rosso al rosso reale

db.fruit.find();
{
    "_id" : ObjectId("53fa1809132c1f084b005cd0"),
    "color" : "real red",
    "shape" : "round",
    "name" : "apple"
}

Salva una mela 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 è stata inserita in quanto non esiste un Apple con lo stesso ID oggetto per eseguire un aggiornamento

Inserisci un'arancia

db.fruit.insert({"name":"orange", "color":"orange","shape":"round"})
WriteResult({ "nInserted" : 1 })

L'arancione è inserito

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"
}

Quindi save agirà come un aggiornamento se fornito con un ID oggetto, a condizione che l'ID oggetto esista già in altro modo se inserisce.


10

Se si tenta di utilizzare "insert" con un ID precedentemente utilizzato nella stessa raccolta, si otterrà un errore di chiave duplicata. Se si utilizza "salva" con un ID già presente nella stessa raccolta, verrà aggiornato / sovrascritto.

Se stai cercando di fare un vero aggiornamento, suggerirei di utilizzare "Aggiorna". L'aggiornamento non verrà sovrascritto come farebbe il salvataggio se si sta salvando utilizzando lo stesso ID già presente nella raccolta.

Ad esempio, hai due campi "x" e "y" e vuoi mantenerli entrambi, ma modifica il valore di "x". Se hai scelto il comando "salva" e non hai incluso y con il valore precedente o non hai affatto y nel tuo salvataggio, allora y non avrebbe più lo stesso valore o sarebbe lì. Tuttavia, se scegli di aggiornare utilizzando $ set e includi solo x nella tua dichiarazione di aggiornamento, non influiresti su y.



3

Considera il documento seguente

{ "_id" : 1, "domainName" : "test1.com", "hosting" : "hostgator.com" }

se db contiene già il documento con _id: 1, allora

l'operazione di salvataggio genererà l'eccezione come di seguito

E11000 duplicate key error index ...........

e dove l'operazione di inserimento sostituirà semplicemente il documento.


db.collection.save()Il metodo aggiorna il documento se nel database esiste già un documento con lo stesso _id. Quando un documento con lo stesso _id esiste già nel database, il metodo di salvataggio sostituisce completamente il documento con il nuovo documento. Dal libro
jack blank

1

In termini di ORACLE: mongo insert => Oracle insert mongo save => Oracle merge


1

db.<collection_name>.save(<Document>) è equivalente alla query InsertOrUpdate.

Mentre, db.<collection_name>.insert(<Document>)equivale solo a Inserisci query.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.