MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

4 maneiras de atualizar um documento no MongoDB


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