Qual'è la differenza tra save e insert in Mongo DB? entrambi sembrano uguali
db.users.save({username:"google",password:"google123"})
db.users.insert({username:"google",password:"google123"})
Qual'è la differenza tra save e insert in Mongo DB? entrambi sembrano uguali
db.users.save({username:"google",password:"google123"})
db.users.insert({username:"google",password:"google123"})
Risposte:
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 _id
campo. 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 :
update
modifica un documento esistente abbinato ai parametri della query. Se non esiste un documento di questo tipo, questo è quando upsert
viene in foto.
upsert : false
: Non succede nulla quando non esiste un documento del genereupsert : true
: Viene creato un nuovo documento con contenuti uguali a parametri di query e parametri di aggiornamentosave
: Non consente alcun parametro di query. se _id
esiste 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.
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:
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 _id
campi.
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.
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.
Come puoi vedere qui, il metodo save eseguirà essenzialmente un upsert (aggiorna se trova il documento, inserisci altrimenti):
http://docs.mongodb.org/manual/reference/method/db.collection.save/#db.collection.save
L'inserto è proprio questo, un inserto diritto.
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
db.<collection_name>.save(<Document>)
è equivalente alla query InsertOrUpdate.
Mentre, db.<collection_name>.insert(<Document>)
equivale solo a Inserisci query.