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