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 o
speciesé"Ledebouria socialis"e oplant_idé3Atualiza a
heightdo documento correspondente para8.3Insere 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}}}} // Sets the upsert option to true opts := options.UpdateOne().SetUpsert(true) // Updates a documents or inserts a document if no documents are // matched and prints the results 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: