Qual é a diferença entre salvar e inserir no Mongo DB? ambos parecem iguais
db.users.save({username:"google",password:"google123"})
db.users.insert({username:"google",password:"google123"})
Qual é a diferença entre salvar e inserir no Mongo DB? ambos parecem iguais
db.users.save({username:"google",password:"google123"})
db.users.insert({username:"google",password:"google123"})
Respostas:
Salvar vs inserção:
Nos seus exemplos, o comportamento é essencialmente o mesmo.
save
se comporta de maneira diferente se for passado com um parâmetro "_id".
Para salvar, se o documento contiver _id
, ele pesquisará a coleção no _id
campo; caso contrário, ele será inserido.
Se um documento não existir com o valor _id especificado, o método save () executará uma inserção com os campos especificados no documento.
Se existir um documento com o valor especificado _id, o método save () executará uma atualização, substituindo todos os campos no registro existente pelos campos do documento.
Salvar vs Atualização :
update
modifica um documento existente correspondente aos seus parâmetros de consulta. Se não houver esse documento correspondente, é quando upsert
aparece a imagem.
upsert : false
: Nada acontece quando esse documento não existeupsert : true
: Novo documento é criado com conteúdo igual a consulta de parâmetros e atualização de parâmetrossave
: Não permite nenhum parâmetro de consulta. se _id
existir e houver um documento correspondente ao mesmo _id
, ele o substituirá. Quando nenhum _id especificado / nenhum documento correspondente, ele insere o documento como um novo.
Vamos considerar os dois casos aqui para salvar:
1) Tendo _id no doc.
2) Não ter _id no 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.
Vamos considerar os dois casos aqui para inserção:
1) Ter _id do doc na coleção.
2) Não ter _id de doc na coleção.
Insert()
/ \
/ \
Doc Having _id in collection Doc Not Having _id
-> E11000 duplicate key ->Insert a new doc inside the collection.
error index:
save
insira ou atualize um documento.
insert
faz apenas uma inserção.
Mas, no seu caso, ele fará o mesmo, pois o documento fornecido em save não possui _id
campo.
Dando um exemplo
Salve uma Apple
db.fruit.save({"name":"apple", "color":"red","shape":"round"})
WriteResult({ "nInserted" : 1 })
db.fruit.find();
{
"_id" : ObjectId("53fa1809132c1f084b005cd0"),
"color" : "red",
"shape" : "round",
"name" : "apple"
}
Salve uma maçã com _id da maçã salva anteriormente
db.fruit.save(
{"_id" : ObjectId("53fa1809132c1f084b005cd0"),"name":"apple",
"color":"real red","shape":"round"})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Agora a maçã que salvamos tem, cor atualizada de vermelho para vermelho real
db.fruit.find();
{
"_id" : ObjectId("53fa1809132c1f084b005cd0"),
"color" : "real red",
"shape" : "round",
"name" : "apple"
}
Salve uma maçã com _id
db.fruit.save({"_id" : ObjectId("55551809132c1f084b005cd0"),
"name":"apple", "color":"real red","shape":"round"})
WriteResult({ "nMatched" : 0, "nUpserted" : 1,
"nModified" : 0, "_id": 55551809132c1f084b005cd0 })
A Apple foi inserida porque não há maçã com o mesmo ID de objeto para fazer uma atualização
Inserir uma laranja
db.fruit.insert({"name":"orange", "color":"orange","shape":"round"})
WriteResult({ "nInserted" : 1 })
Laranja é inserida
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"
}
Portanto, save será uma atualização se fornecida com um ID do objeto, desde que o ID do objeto já exista de outra forma.
Se você tentar usar "inserir" com um ID que foi usado anteriormente na mesma coleção, você receberá um erro de chave duplicada. Se você usar "salvar" com um ID que já esteja na mesma coleção, ele será atualizado / substituído.
Se você estiver procurando fazer uma atualização verdadeira, sugiro usar "update". A atualização não será substituída da maneira que o Save faria se você estivesse salvando usando o mesmo ID que já está na coleção.
Por exemplo, você tem dois campos "x" e "y" e deseja manter os dois, mas altere o valor de "x". Se você escolheu o comando "salvar" e não incluiu y com o valor anterior ou não tem y em seu salvamento, y não terá mais o mesmo valor ou estará lá. No entanto, se você optar por atualizar usando $ set e tiver apenas x incluído na sua declaração de atualização, você não afetará y.
Como você pode ver aqui, o método save fará essencialmente uma upsert (atualize se encontrar o documento, insira o contrário):
http://docs.mongodb.org/manual/reference/method/db.collection.save/#db.collection.save
Inserir é apenas isso, um inserto reto.
Considere o documento abaixo
{ "_id" : 1, "domainName" : "test1.com", "hosting" : "hostgator.com" }
se o db já contiver o documento com _id: 1,
salvar operação lançará a exceção como abaixo
E11000 duplicate key error index ...........
e onde, como operação de inserção, substituirá apenas o documento.
db.collection.save()
O método atualiza o documento se um documento com o mesmo _id já existir no banco de dados. Quando um documento com o mesmo _id já existe no banco de dados, o método save substitui completamente o documento pelo novo documento. Do livro - Pro MongoDB Development
db.<collection_name>.save(<Document>)
é equivalente à consulta InsertOrUpdate.
Enquanto, db.<collection_name>.insert(<Document>)
é equivalente a apenas Inserir Consulta.