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
sizesonde 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
hotOptionspara 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: