Menu Docs
Página inicial do Docs
/ / /
Driver GO
/ / /

Atualizar Matrizes em um Documento

Nesta página

  • Visão geral
  • Dados de amostra
  • Especificar Elementos de Matriz
  • Primeiro elemento de array
  • Vários elementos de array
  • Todos os elementos de array
  • Informações adicionais
  • Documentação da API

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.

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().

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.

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.

Este exemplo executa as seguintes ações:

  • Corresponde aos elementos de matriz em sizes onde o valor é menor ou igual a 16.

  • 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 consulta 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.

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.

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))

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.

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))

Para saber mais sobre as operações abordadas neste guia, consulte os seguintes guias:

Para saber mais sobre qualquer um dos métodos ou tipos discutidos neste guia, consulte a seguinte documentação da API:

Voltar

Modificar documentos