Atualizar Matrizes em um Documento
Nesta página
Visão geral
Neste guia, você pode aprender como atualizar os elementos de array em um documento.
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
Para executar os exemplos neste guia, carregue os dados de amostra na collection quantity.tea
com o seguinte trecho:
coll := client.Database("tea").Collection("quantity") docs := []interface{}{ bson.D{{"type", "Masala"}, {"qty", bson.A{15, 12, 18}}}, } result, err := coll.InsertMany(context.TODO(), docs) if err != nil { panic(err) } fmt.Printf("%d documents inserted with IDs:\n", len(result.InsertedIDs))
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()
.
Observação
Cada exemplo trunca o valor ObjectID
porque o driver o gera exclusivamente.
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
qty
onde o valor é maior que10
.Diminui o primeiro valor da matriz correspondente a
5
.
filter := bson.D{{"qty", bson.D{{"$gt", 10}}}} update := bson.D{{"$inc", bson.D{{"qty.$", -5}}}} opts := options.FindOneAndUpdate().SetReturnDocument(options.After) var updatedDoc bson.D err := coll.FindOneAndUpdate(context.TODO(), filter, update, opts).Decode(&updatedDoc) if err != nil { panic(err) } fmt.Println(updatedDoc)
Observação
O filtro de consulta corresponde aos valores 15
e 12
. Como 15
é o primeiro elemento correspondido, ele é atualizado. 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
smaller
para corresponder a elementos menores que18
.Aplica o filtro de matriz utilizando o método
SetArrayFilters()
.Aumenta cada elemento correspondente em
7
.
identifier := []interface{}{bson.D{{"smaller", bson.D{{"$lt", 18}}}}} update := bson.D{{"$inc", bson.D{{"qty.$[smaller]", 7}}}} opts := options.FindOneAndUpdate().SetArrayFilters(options.ArrayFilters{Filters: identifier}).SetReturnDocument(options.After) var updatedDoc bson.D err := coll.FindOneAndUpdate(context.TODO(), bson.D{}, update, opts).Decode(&updatedDoc) if err != nil { panic(err) } fmt.Println(updatedDoc)
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 qty
por 2
:
update := bson.D{{"$mul", bson.D{{"qty.$[]", 2}}}} opts := options.FindOneAndUpdate().SetReturnDocument(options.After) var updatedDoc bson.D err := coll.FindOneAndUpdate(context.TODO(), bson.D{}, update, opts).Decode(&updatedDoc) if err != nil { panic(err) } fmt.Println(updatedDoc)
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: