Atualizar Matrizes em um Documento
Nesta página
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") 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
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 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
O filtro de queries corresponde aos valores 12
e 16
. Como a operação coincide 12
primeiro, ela é diminuída. Se você quiser 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 "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: