Qual é a diferença entre salvar e inserir no Mongo DB?

148

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"})
user2093576
fonte
1
fyi save () agora está obsoleto no pymongo.
Gabriel Fair

Respostas:

146

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

updatemodifica um documento existente correspondente aos seus parâmetros de consulta. Se não houver esse documento correspondente, é quando upsertaparece a imagem.

  • upsert : false : Nada acontece quando esse documento não existe
  • upsert : true : Novo documento é criado com conteúdo igual a consulta de parâmetros e atualização de parâmetros

save: Não permite nenhum parâmetro de consulta. se _idexistir 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.

Rahul
fonte
8
ambos têm sintaxe diferente. A atualização recebe vários argumentos ({condition}, {update to doc}, upsert, multi) enquanto o save aceita apenas um argumento (_id sendo o parâmetro do argumento condicional). _id campo.
Rahul
1
A partir da versão 2.6, save possui um segundo argumento que aceita um documento que expressa a preocupação com a gravação. docs.mongodb.org/manual/reference/method/db.collection.save
huggie
77

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:       
esquiróide
fonte
10
Diagramas de nível seguinte
John Spiteri
2
Promovido o tempo gasto para desenhar e apresentar os diagramas com precisão.
fanbondi
36

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

Aurélien B
fonte
13

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.

Abhi
fonte
10

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.

RoganRicheart
fonte
3

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.

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

Em termos de ORACLE: mongo insert => Oracle insira mongo save => Oracle merge

Jagan
fonte
1

db.<collection_name>.save(<Document>) é equivalente à consulta InsertOrUpdate.

Enquanto, db.<collection_name>.insert(<Document>)é equivalente a apenas Inserir Consulta.

Vijet Badigannavar
fonte