Inserir ou atualizar em uma única operação
Nesta página
Visão geral
Neste guia, você aprenderá a realizar uma upsert.
Dados de amostra
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á.
Upsert
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()
.
Exemplo
O exemplo a seguir executa as seguintes ações:
Corresponde a documentos onde a
species
é "Ledebouria socialis" e oplant_id
é3
Atualiza a
height
do documento correspondente para8.3
Insere esse documento se não houver correspondência com o filtro de queries
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)
Number of documents updated: 0 Number of documents upserted: 1
Se você fizer query na coleção plants
para visualizar todos os documentos, poderá ver que, como o filtro de queries 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}
Informações adicionais
Para saber mais sobre as operações mencionadas, consulte os seguintes guias:
Documentação da API
Para saber mais sobre qualquer um dos métodos ou tipos mencionados neste guia, consulte a seguinte documentação da API: