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 um documento 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 deste guia utilizam o seguinte Drink estruturado 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") docs := []interface{}{ Drink{Description: "Matcha Latte", Sizes: []int32{12, 16, 20}, Styles: []string{"iced", "hot", "extra hot"}}, } result, err := coll.InsertMany(context.TODO(), docs)
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
To specify which array elements to update, use a positional operator. Positional operators can specify the first, multiple, or all array elements to update.
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 matriz correspondente a
2.
filter := bson.D{{"sizes", bson.D{{"$lte", 16}}}} update := bson.D{{"$inc", bson.D{{"sizes.$", -2}}}} opts := options.FindOneAndUpdate(). SetReturnDocument(options.After) var updatedDoc Drink err := coll.FindOneAndUpdate(context.TODO(), filter, update, opts).Decode(&updatedDoc) if err != nil { panic(err) } res, _ := bson.MarshalExtJSON(updatedDoc, false, false) fmt.Println(string(res))
Observação
The query filter matches the values 12 and 16. Since the operation matches 12 first, it is decremented. If you want to update both matched values, see Multiple Array Elements.
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 "hot".Aplica o filtro de matriz utilizando o método
SetArrayFilters().Remove esses elementos de array.
identifier := []interface{}{bson.D{{"hotOptions", bson.D{{"$regex", "hot"}}}}} update := bson.D{{"$unset", bson.D{{"styles.$[hotOptions]", ""}}}} opts := options.FindOneAndUpdate(). SetArrayFilters(options.ArrayFilters{Filters: identifier}). SetReturnDocument(options.After) var updatedDoc Drink err := coll.FindOneAndUpdate(context.TODO(), bson.D{}, update, opts).Decode(&updatedDoc) if err != nil { panic(err) } res, _ := bson.MarshalExtJSON(updatedDoc, false, false) fmt.Println(string(res))
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:
update := bson.D{{"$mul", bson.D{{"sizes.$[]", 29.57}}}} opts := options.FindOneAndUpdate(). SetReturnDocument(options.After) var updatedDoc Drink err := coll.FindOneAndUpdate(context.TODO(), bson.D{}, update, opts).Decode(&updatedDoc) if err != nil { panic(err) } res, _ := bson.MarshalExtJSON(updatedDoc, false, false) fmt.Println(string(res))
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: