Menu Docs

Atualizar Matrizes em um Documento

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

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

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 a string "hot".

  • Aplica o filtro de matriz utilizando o método SetArrayFilters() ao criar uma instância do FindOneAndUpdateOptions.

  • 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","",""]}

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:

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"]}

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: