Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Menu Docs
Página inicial do Docs
/ / /
Driver GO
/

Atualize documentos

Neste guia, você pode aprender como atualizar documentos no MongoDB usando operações de atualização.

As operações de atualização alteram os campos que você especifica, deixando outros campos e valores inalterados.

No MongoDB, todos os métodos para modificar documentos seguem o mesmo padrão:

Alterar assinatura do método

Observação

Espaço reservado

changeX é um espaço reservado e não um método real.

O padrão espera que você:

  • Especifique um filtro de consulta para corresponder a um ou mais documentos para modificar.

  • Especifique as alterações de campo e valor.

  • Se você precisar modificar o comportamento do método, especifique as opções.

O driver fornece os seguintes métodos para atualizar documentos:

  • UpdateByID(): atualiza um único documento com base em seu _id.

  • UpdateOne(): Atualiza um único documento.

  • UpdateMany(): Atualiza vários documentos.

Cada documento em uma coleção MongoDB tem um campo _id exclusivo e imutável. Você não pode utilizar operações de atualização para alterar o campo _id. Se você tentar alterar este campo, os métodos de atualização retornarão um WriteError.

Cada método utiliza um documento de atualização que inclui pelo menos um operador de atualização. O operador de atualização especifica o tipo de atualização a ser executada. O documento de atualização também inclui os campos e valores que descrevem a alteração. Atualize os documentos usando o seguinte formato:

bson.D{{"<update operator>", bson.D{{"<field>", <value>},
{"<field>", <value>}, ... }},
{"<update operator>", ... }, ... }

Consulte o manual do servidor MongoDB para obter uma lista completa de operadores de atualização e descrições.

Dica

UpdateOne() atualiza o primeiro documento que corresponde ao filtro de query que você fornece. Para garantir que você atualize o documento correto, você pode usar a opção sort para especificar a ordem em que a operação localiza os documentos. Para saber mais, consulte a documentação da API UpdateOneOptions.

Observação

Pipelines de agregação em operações de atualização

Você pode usar agregação pipelines compostos por um subconjunto de agregação stages em operações de atualização. Para saber mais sobre os estágios de agregação que o MongoDB suporta em pipelines de agregação, consulte o tutorial sobre como executar atualizações com pipeline de agregação no manual do servidor.

UpdateOne(), UpdateByID() e UpdateMany() retornam um tipo UpdateResult que contém informações sobre a operação de atualização, se a operação for bem-sucedida. O tipo UpdateResult contém as seguintes propriedades:

Propriedade
Descrição

MatchedCount

O número de documentos correspondidos pelo filtro

ModifiedCount

O número de documentos modificados pela operação

UpsertedCount

O número de documentos atualizados pela operação

UpsertedID

O _id do documento atualizado ou nil, se não houver nenhum

Se vários documentos corresponderem ao filtro de query passado para UpdateOne(), o método selecionará e atualizará o primeiro documento correspondente. Se nenhum documento corresponder ao filtro de query, a operação de atualização não fará alterações.

Consulte o guia upsert para saber como inserir um novo documento se nenhum documento corresponder ao filtro de query.

O exemplo seguinte utiliza a coleção do listingsAndReviews no conjunto de dados do sample_airbnb a partir dos conjuntos de dados de amostra do Atlas. O seguinte documento descreve um anúncio do airbnb:

{
"_id": "10006546",
"listing_url": "https://www.airbnb.com/rooms/10006546",
"name": "Ribeira Charming Duplex",
"summary": "Fantastic duplex apartment with three bedrooms, located in the historic area of Porto, Ribeira (Cube)...",
...
"minimum_nights": "2",
"maximum_nights": "30",
...
"accommodates": 8,
...
}

O exemplo a seguir utiliza o método UpdateOne() para:

  • Corresponde ao documento no qual o valor de _id é "10006546".

  • Defina o campo name como "Ribiera River View Duplex".

  • Aumente o valor do campo accommodates em 1.

filter := bson.D{{"_id", "10006546"}}
update := bson.D{{"$set", bson.D{{"name", "Ribiera River View Duplex"}}},
{"$inc", bson.D{{"accomodates", 1}}}}
result, err := collection.UpdateOne(context.TODO(), filter, update)
fmt.Printf("Documents matched: %v\n", result.MatchedCount)
fmt.Printf("Documents updated: %v\n", result.ModifiedCount)
Documents matched: 1
Documents updated: 1

O seguinte mostra o documento atualizado resultante da operação de atualização anterior:

{
"_id": "10006546",
"listing_url": "https://www.airbnb.com/rooms/10006546",
"name": "Ribeira River View Duplex",
"summary": "Fantastic duplex apartment with three bedrooms, located in the historic area of Porto, Ribeira (Cube)...",
...
"minimum_nights": "2",
"maximum_nights": "30",
...
"accommodates": 9,
...
}

Observação

Exemplo de configuração

Esse exemplo se conecta a uma instância do MongoDB usando um URI de conexão. Para saber mais sobre como se conectar à sua instância do MongoDB, consulte o guia Como criar um MongoClient. Este exemplo também utiliza a coleção do restaurants no banco de dados do sample_restaurants incluído nos conjuntos de dados de amostra do Atlas. Você pode carregá-los em seu banco de dados na camada grátis do MongoDB Atlas seguindo o Guia de Introdução ao Atlas.

O exemplo a seguir é um arquivo totalmente executável que executa as seguintes ações na coleção restaurants :

  • Encontra um documento com um específico _id

  • Atualiza o valor de campo avg_rating do documento correspondente

// Updates the first document that matches a query filter by using the Go driver
package main
import (
"context"
"fmt"
"log"
"os"
"github.com/joho/godotenv"
"go.mongodb.org/mongo-driver/v2/bson"
"go.mongodb.org/mongo-driver/v2/mongo"
"go.mongodb.org/mongo-driver/v2/mongo/options"
)
// Defines a Restaurant struct as a model for documents in the "restaurants" collection
type Restaurant struct {
ID bson.ObjectID `bson:"_id"`
Name string `bson:"name"`
AverageRating float64 `bson:"avg_rating,omitempty"`
}
func main() {
if err := godotenv.Load(); err != nil {
log.Println("No .env file found")
}
var uri string
if uri = os.Getenv("MONGODB_URI"); uri == "" {
log.Fatal("You must set your 'MONGODB_URI' environment variable. See\n\t https://www.mongodb.com/pt-br/docs/drivers/go/current/connect/mongoclient/#environment-variable")
}
client, err := mongo.Connect(options.Client().ApplyURI(uri))
if err != nil {
panic(err)
}
defer func() {
if err = client.Disconnect(context.TODO()); err != nil {
panic(err)
}
}()
coll := client.Database("sample_restaurants").Collection("restaurants")
id, _ := bson.ObjectIDFromHex("5eb3d668b31de5d588f4292b")
filter := bson.D{{"_id", id}}
// Creates instructions to add the "avg_rating" field to documents
update := bson.D{{"$set", bson.D{{"avg_rating", 4.4}}}}
// Updates the first document that has the specified "_id" value
result, err := coll.UpdateOne(context.TODO(), filter, update)
if err != nil {
panic(err)
}
// Prints the number of updated documents
fmt.Printf("Documents updated: %v\n", result.ModifiedCount)
// When you run this file for the first time, it should print output similar to the following:
// Documents updated: 1
}
Documents updated: 1

Observação

Exemplo de configuração

Esse exemplo se conecta a uma instância do MongoDB usando um URI de conexão. Para saber mais sobre como se conectar à sua instância do MongoDB, consulte o guia Como criar um MongoClient. Este exemplo também utiliza a coleção do restaurants no banco de dados do sample_restaurants incluído nos conjuntos de dados de amostra do Atlas. Você pode carregá-los em seu banco de dados na camada grátis do MongoDB Atlas seguindo o Guia de Introdução ao Atlas.

O exemplo a seguir é um arquivo totalmente executável que executa as seguintes ações na coleção restaurants :

  • Localiza documentos com o valor de campo cuisine de "Pizza" e o valor de campo borough de "Brooklyn"

  • Atualiza o valor de campo avg_rating dos documentos correspondentes

// Updates documents that match a query filter by using the Go driver
package main
import (
"context"
"fmt"
"log"
"os"
"github.com/joho/godotenv"
"go.mongodb.org/mongo-driver/v2/bson"
"go.mongodb.org/mongo-driver/v2/mongo"
"go.mongodb.org/mongo-driver/v2/mongo/options"
)
// Defines a Restaurant struct as a model for documents in the "restaurants" collection
type Restaurant struct {
ID bson.ObjectID `bson:"_id"`
Name string `bson:"name"`
Cuisine string `bson:"cuisine"`
AverageRating float64 `bson:"avg_rating,omitempty"`
}
func main() {
if err := godotenv.Load(); err != nil {
log.Println("No .env file found")
}
var uri string
if uri = os.Getenv("MONGODB_URI"); uri == "" {
log.Fatal("You must set your 'MONGODB_URI' environment variable. See\n\t https://www.mongodb.com/pt-br/docs/drivers/go/current/connect/mongoclient/#environment-variable")
}
client, err := mongo.Connect(options.Client().ApplyURI(uri))
if err != nil {
panic(err)
}
defer func() {
if err = client.Disconnect(context.TODO()); err != nil {
panic(err)
}
}()
coll := client.Database("sample_restaurants").Collection("restaurants")
filter := bson.D{{"cuisine", "Pizza"}, {"borough", "Brooklyn"}}
// Creates instructions to update the values of the "avg_rating" field
update := bson.D{{"$set", bson.D{{"avg_rating", 4.5}}}}
// Updates documents in which the value of the "Cuisine"
// field is "Pizza"
result, err := coll.UpdateMany(context.TODO(), filter, update)
if err != nil {
panic(err)
}
// Prints the number of updated documents
fmt.Printf("Documents updated: %v\n", result.ModifiedCount)
// end updatemany
// When you run this file for the first time, it should print output similar to the following:
// Documents updated: 296
}
Documents updated: 296

Para saber mais sobre as operações mencionadas, consulte os seguintes guias:

Para saber mais sobre como atualizar elementos de array, consulte Atualizar arrays em um documento.

Para saber mais sobre qualquer um dos métodos ou tipos discutidos neste guia, consulte a seguinte documentação da API:

Voltar

Consultas geoespaciais

Nesta página