Menu Docs
Página inicial do Docs
/ / /
Driver GO
/ / /

Inserir ou atualizar em uma única operação

Nesta página

  • Visão geral
  • Upsert
  • Informações adicionais

Neste guia, você aprenderá a realizar uma upsert.

O exemplo nesta aba usa o seguinte struct Plant como um modelo para documentos na collection plants:

type Plant struct {
Species string
PlantID int32 `bson:"plant_id"`
Height float64
}

Para executar o exemplo nesta aba, carregue os dados de amostra na collection db.plants com o seguinte trecho:

coll := client.Database("db").Collection("plants")
docs := []interface{}{
Plant{Species: "Polyscias fruticosa", PlantID: 1, Height: 27.6},
Plant{Species: "Polyscias fruticosa", PlantID: 2, Height: 34.9},
Plant{Species: "Ledebouria socialis", PlantID: 1, Height: 11.4},
}
result, err := coll.InsertMany(context.TODO(), docs)

Cada documento contém uma descrição de uma planta individual que inclui a espécie, ID da planta e altura correspondentes aos campos species, plant_id e height em cada documento.

Dica

Bancos de Dados e Coleções Inexistentes

Se o banco de dados e a collection necessários não existirem quando você executar uma operação de escrita, o servidor implicitamente os criará.

Os aplicativos utilizam operações de inserção e atualização para armazenar e modificar dados. Às vezes, você deve escolher entre uma operação de inserção e uma operação de atualização, dependendo da existência do documento. O MongoDB simplifica essa decisão para nós com uma opção upsert.

A opção upsert realiza uma das seguintes ações:

  • Atualiza documentos que correspondem ao seu filtro de consulta

  • Insere um novo documento se não houver correspondência com o filtro de consulta

Você pode especificar um upsert passando true para o método SetUpsert() nas opções dos seguintes métodos de operação de escrita:

  • UpdateOne()

  • UpdateByID()

  • UpdateMany()

  • ReplaceOne()

  • FindOneAndUpdate()

  • FindOneAndReplace()

Dica

Se você não especificar um upsert, nenhuma alteração ocorrerá na operação de gravação quando nenhum documento corresponder ao seu filtro de consulta. Isto é equivalente a passar false para o método SetUpsert().

O exemplo a seguir executa as seguintes ações:

  • Corresponde a documentos onde a species é "Ledebouria socialis" e o plant_id é 3

  • Atualiza a height do documento correspondente para 8.3

  • Insere esse documento se não houver correspondência com o filtro de consulta

filter := bson.D{{"species", "Ledebouria socialis"}, {"plant_id", 3}}
update := bson.D{{"$set", bson.D{{"species", "Ledebouria socialis"}, {"plant_id", 3}, {"height", 8.3}}}}
opts := options.Update().SetUpsert(true)
result, err := coll.UpdateOne(context.TODO(), filter, update, opts)
if err != nil {
panic(err)
}
fmt.Printf("Number of documents updated: %v\n", result.ModifiedCount)
fmt.Printf("Number of documents upserted: %v\n", result.UpsertedCount)

Se você fizer query na coleção plants para visualizar todos os documentos, poderá ver que, como o filtro de query não correspondeu a nenhum documento, um novo documento foi inserido com os campos especificados:

{"species":"Polyscias fruticosa","plant_id":1,"height":27.6}
{"species":"Polyscias fruticosa","plant_id":2,"height":34.9}
{"species":"Ledebouria socialis","plant_id":1,"height":11.4}
{"species":"Ledebouria socialis","plant_id":3,"height":8.3}

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

  • Especificar uma query

  • Modificar documentos

  • Operações compostas

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

← Atualizar Matrizes em um Documento