O MongoDB fornece várias maneiras de atualizar um documento. O método usado dependerá exatamente de como você deseja realizar a atualização.
Este artigo apresenta 4 maneiras de atualizar um documento no MongoDB.
O db.collection.updateOne() Método
O
db.collection.updateOne() O método faz exatamente o que seu nome promete – ele atualiza um documento. Suponha que tenhamos uma coleção chamada
pets que contém os seguintes documentos:{ "_id" : 1, "name" : "Wag", "type" : "Dog" }
{ "_id" : 2, "name" : "Bark", "type" : "Dog" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" } Poderíamos atualizar um documento assim:
db.pets.updateOne(
{ type: "Dog" },
{ $set: { type: "Cow" } }
) Resultado:
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 } Isso atualizou apenas um documento, embora dois documentos correspondam aos critérios do filtro (os critérios sendo
type: "Dog" ). Podemos verificar os resultados assim:
db.pets.find() Resultado:
{ "_id" : 1, "name" : "Wag", "type" : "Cow" }
{ "_id" : 2, "name" : "Bark", "type" : "Dog" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" } O primeiro documento agora tem um
type de Cow em vez de Dog , mas o segundo documento não foi afetado, embora também atendesse aos critérios de filtragem. O db.collection.updateMany() Método
O
db.collection.updateMany() O método atualiza todos os documentos que correspondem ao filtro especificado para uma coleção. Vamos usar os documentos de coleção originais:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" }
{ "_id" : 2, "name" : "Bark", "type" : "Dog" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" } Mais uma vez, podemos ver que dois documentos têm
Dog como seu type . Podemos atualizar os dois documentos de uma só vez assim:
db.pets.updateMany(
{ type: "Dog" },
{ $set: { type: "Cow" } }
) Resultado:
{ "acknowledged" : true, "matchedCount" : 2, "modifiedCount" : 2 } Isso nos mostra que dois documentos corresponderam e dois foram atualizados.
Podemos conferir a coleção:
db.pets.find() Resultado:
{ "_id" : 1, "name" : "Wag", "type" : "Cow" }
{ "_id" : 2, "name" : "Bark", "type" : "Cow" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" } O db.collection.update() Método
O
db.collection.update() O método pode atualizar um único documento ou vários documentos em uma coleção. Por padrão, ele atualiza apenas um único documento. Mas se
multi: true for especificado, ele atualizará todos os documentos que correspondem aos critérios de consulta. Atualizar um único documento
Vamos usar a coleção original de documentos novamente:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" }
{ "_id" : 2, "name" : "Bark", "type" : "Dog" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" } Poderíamos atualizar um documento assim:
db.pets.update(
{ type: "Dog" },
{ $set: { type: "Cow" } }
) Resultado:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) Apenas um documento foi atualizado. Isso é confirmado quando consultamos a coleção.
db.pets.find() Resultado:
{ "_id" : 1, "name" : "Wag", "type" : "Cow" }
{ "_id" : 2, "name" : "Bark", "type" : "Dog" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" } Atualizar vários documentos
Vamos voltar à coleção original de documentos novamente:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" }
{ "_id" : 2, "name" : "Bark", "type" : "Dog" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" } E agora vamos adicionar
multi: true à nossa operação de atualização para atualizar todos os documentos que correspondem aos critérios de consulta:db.pets.update(
{ type: "Dog" },
{ $set: { type: "Cow" } },
{ multi: true }
) Resultado:
WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 }) Assim, dois documentos foram combinados e atualizados desta vez.
Vejamos novamente nossa coleção:
db.pets.find() Resultado:
{ "_id" : 1, "name" : "Wag", "type" : "Cow" }
{ "_id" : 2, "name" : "Bark", "type" : "Cow" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" } Como esperado, ambos os documentos agora têm um
type de Cow . O db.collection.replaceOne() Método
O
db.collection.replaceOne() O método substitui um único documento dentro da coleção com base no filtro. Novamente usando a coleção original:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" }
{ "_id" : 2, "name" : "Bark", "type" : "Dog" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" } Vamos ver o que acontece quando usamos o
db.collection.replaceOne() método contra ele. db.pets.replaceOne(
{ type: "Dog" },
{ type: "Cow" }
) Resultado:
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 } Um documento foi atualizado.
Vamos dar uma olhada.
db.pets.find() Resultado:
{ "_id" : 1, "type" : "Cow" }
{ "_id" : 2, "name" : "Bark", "type" : "Dog" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" } Desta vez, todo o documento foi substituído pelo novo documento (exceto pelo
_id campo). Este método substitui todo o documento (exceto o
_id campo). Upsert
Todos os métodos acima aceitam um
upsert argumento que permite executar uma operação de upsert. Quando
upsert: true , o documento é atualizado se houver correspondência com os critérios da consulta, mas se não houver correspondência, um novo documento será inserido. Exemplo:
db.pets.updateOne(
{ name: "Wag" },
{ $set: { type: "Cow" } },
{ upsert: true }
) Resultado:
{
"acknowledged" : true,
"matchedCount" : 0,
"modifiedCount" : 0,
"upsertedId" : ObjectId("5fe1d5aad991410169410165")
} Nesse caso, não houve correspondências, então um documento foi upserted.
Vamos conferir a coleção.
db.pets.find() Resultado:
{ "_id" : 1, "type" : "Cow" }
{ "_id" : 2, "name" : "Bark", "type" : "Dog" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }
{ "_id" : ObjectId("5fe1d5aad991410169410165"), "name" : "Wag", "type" : "Cow" }