Visão geral
Neste guia, você pode aprender como atualizar os elementos de array em um ou mais documentos.
Para atualizar elementos em uma matriz, execute as seguintes ações:
Forneça umdocumento de atualização que especifique a atualização.
Especifique quais elementos de array atualizar.
Execute a atualização utilizando uma operação de atualização com estas especificações.
Dados de amostra
Os exemplos nesta aba usam o seguinte struct Drink
como um modelo para documentos na coleção drinks
:
type Drink struct { Description string Sizes []int32 `bson:"sizes,truncate"` Styles []string }
A marcação de estrutura truncate
permite ao driver truncar tipos como float64
a int32
ao desordenar.
Para executar os exemplos nesta aba, carregue os dados de amostra na coleção db.drinks
com o seguinte trecho:
coll := client.Database("db").Collection("drinks") docsToInsert := []interface{}{ Drink{Description: "Matcha Latte", Sizes: []int32{12, 16, 20}, Styles: []string{"iced", "hot", "extra hot"}}, } result, err := coll.InsertMany(context.TODO(), docsToInsert)
Cada documento contém uma descrição de uma bebida que inclui a descrição da bebida, os tamanhos disponíveis em onças e os estilos de preparação disponíveis, correspondentes aos campos description
, sizes
e styles
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 exemplos seguintes utilizam o método FindOneAndUpdate()
para recuperar e atualizar um documento e retornar o estado do documento após a atualização ocorrer. Se você deseja atualizar vários documentos com um campo de matriz, utilize o método UpdateMany()
.
Especificar Elementos de Matriz
Para especificar quais elementos da matriz devem ser atualizados, use um operador posicional. Os operadores posicionais podem especificar o primeiro, vários ou todos os elementos da matriz a serem atualizados.
Para especificar elementos de matriz com um operador posicional, utilize notação de ponto. A notação de ponto é uma sintaxe de acesso à propriedade para navegar pelos elementos e campos da matriz de um documento incorporado.
Primeiro elemento de array
Para atualizar o primeiro elemento de matriz que corresponde ao seu filtro de consulta, utilize o operador $
posicional. O filtro de consulta deve ser para o campo de matriz.
Exemplo
Este exemplo executa as seguintes ações:
Corresponde aos elementos de matriz em
sizes
onde o valor é menor ou igual a16
.Diminui o primeiro valor da array correspondente em
2
.
filter := bson.D{{"sizes", bson.D{{"$lte", 16}}}} update := bson.D{{"$inc", bson.D{{"sizes.$", -2}}}} opts := options.FindOneAndUpdate(). SetReturnDocument(options.After) // Updates the first document that matches the filter var updatedDoc Drink err := coll.FindOneAndUpdate(context.TODO(), filter, update, opts). Decode(&updatedDoc) if err != nil { panic(err) } // Prints the updated document res, _ := bson.MarshalExtJSON(updatedDoc, false, false) fmt.Println(string(res))
{"description":"Matcha Latte","sizes":[10,16,20],"styles":["iced","hot","extra hot"]}
Observação
No exemplo anterior, o filtro de consulta corresponde aos valores 12
e 16
. Como a operação coincide 12
primeiro, ela é o destino da atualização. Para saber como atualizar ambos os valores correspondentes, consulte Vários elementos de matriz.
Vários elementos de array
Para atualizar vários elementos de matriz que correspondam à sua consulta de filtro, use o operador $[<identifier>]
posicional filtrado. Você deve incluir um filtro de matriz em sua operação de atualização para especificar quais elementos de matriz devem ser atualizados.
O <identifier>
é o nome que você utiliza dentro do filtro de matriz. Esse valor deve começar com uma letra minúscula e conter apenas caracteres alfanuméricos.
Exemplo
Este exemplo executa as seguintes ações:
Cria um filtro de matriz com um identificador chamado
hotOptions
para corresponder aos elementos de matriz que contêm a string"hot"
.Aplica o filtro de matriz utilizando o método
SetArrayFilters()
ao criar uma instância doFindOneAndUpdateOptions
.Remove os valores destes elementos de array utilizando o método
FindOneAndUpdate()
.
identifier := []interface{}{bson.D{{"hotOptions", bson.D{{"$regex", "hot"}}}}} update := bson.D{{"$unset", bson.D{{"styles.$[hotOptions]", ""}}}} opts := options.FindOneAndUpdate(). SetArrayFilters(identifier). SetReturnDocument(options.After) // Updates the first document that matches the filter var updatedDoc Drink err := coll.FindOneAndUpdate(context.TODO(), bson.D{}, update, opts). Decode(&updatedDoc) if err != nil { panic(err) } // Prints the updated document res, _ := bson.MarshalExtJSON(updatedDoc, false, false) fmt.Println(string(res))
{"description":"Matcha Latte","sizes":[12,16,20],"styles":["iced","",""]}
Todos os elementos de array
Para atualizar todos os elementos da matriz, use o operador $[]
posicional.
Observação
Se você especificar um filtro de query para o campo de array, o operador posicional $[]
ignorará o filtro de query e atualizará todos os elementos de array.
Exemplo
Este exemplo multiplica todos os elementos de matriz em sizes
por 29.57
para converter de onças para mililitros:
identifier := []interface{}{bson.D{{"hotOptions", bson.D{{"$regex", "hot"}}}}} update := bson.D{{"$unset", bson.D{{"styles.$[hotOptions]", ""}}}} opts := options.FindOneAndUpdate(). SetArrayFilters(identifier). SetReturnDocument(options.After) // Updates the first document that matches the filter var updatedDoc Drink err := coll.FindOneAndUpdate(context.TODO(), bson.D{}, update, opts). Decode(&updatedDoc) if err != nil { panic(err) } // Prints the updated document res, _ := bson.MarshalExtJSON(updatedDoc, false, false) fmt.Println(string(res))
{"description":"Matcha Latte","sizes":[354,473,591],"styles":["iced","hot","extra hot"]}
Informações adicionais
Para saber mais sobre as operações abordadas neste guia, consulte os seguintes guias:
Documentação da API
Para saber mais sobre qualquer um dos métodos ou tipos discutidos neste guia, consulte a seguinte documentação da API: