Docs Menu
Docs Home
/ /

Actualizar matrices en un documento

En esta guía, puede aprender cómo actualizar elementos de una matriz en uno o más documentos.

Para actualizar elementos en una matriz, realice las siguientes acciones:

  • Proporcionar una documento de actualización que especifica la actualización.

  • Especifique qué elementos de la matriz desea actualizar.

  • Realice la actualización utilizando una operación de actualización con estas especificaciones.

Los ejemplos de esta guía utilizan lo siguiente: Drink Estructura como modelo para los documentos de la colección drinks:

type Drink struct {
Description string
Sizes []int32 `bson:"sizes,truncate"`
Styles []string
}

La truncate etiqueta de estructura permite al controlador truncar tipos como float64 a int32 al desorganizar.

Para ejecutar los ejemplos de esta guía, cargue los datos de muestra en la colección db.drinks con el siguiente fragmento:

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 contiene una descripción de una bebida que incluye la descripción de la bebida, los tamaños disponibles en onzas y los estilos de preparación disponibles, correspondientes a los campos description, sizes y styles en cada documento.

Tip

Bases de datos y colecciones inexistentes

Si la base de datos y la colección necesarias no existen cuando realiza una operación de escritura, el servidor las crea implícitamente.

Los siguientes ejemplos utilizan el método FindOneAndUpdate() para recuperar y actualizar un documento y devolver su estado tras la actualización. Si desea actualizar varios documentos con un campo de matriz, utilice el método UpdateMany().

Para especificar qué elementos de la matriz actualizar, utilice un operador posicional. Los operadores posicionales pueden especificar primero, varios o todos los elementos de la matriz para actualizar.

Para especificar elementos de matriz con un operador posicional, utilice la notación de punto. Esta es una sintaxis de acceso a propiedades para navegar por los elementos y campos de una matriz de un documento incrustado.

Para actualizar el primer elemento del arreglo que coincida con tu filtro de query, utiliza el operador posicional $. El filtro de query debe ser para el campo arreglo.

Este ejemplo realiza las siguientes acciones:

  • Coincide con los elementos de la matriz en sizes donde el valor es menor o igual a 16.

  • Disminuye el primer valor de la matriz que coincida con 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))
{"description":"Matcha Latte","sizes":[10,16,20],"styles":["iced","hot","extra hot"]}

Nota

El filtro de consulta coincide con los valores 12 16y. Dado que la operación coincide 12 primero con, se decrementa. Si desea actualizar ambos valores coincidentes, consulte Múltiples elementos de matriz.

Para actualizar varios elementos de un arreglo que coincidan con el filtro de query, utiliza el operador posicional filtrado $[<identifier>]. Debes incluir un filtro de arreglo en tu operación de actualización para especificar qué elementos de arreglo actualizar.

<identifier> es el nombre que se usa en el filtro de matriz. Este valor debe empezar con minúscula y contener solo caracteres alfanuméricos.

Este ejemplo realiza las siguientes acciones:

  • Crea un filtro de matriz con un identificador llamado hotOptions para que coincida con los elementos de la matriz que contienen "hot".

  • Aplica el filtro de matriz utilizando el método SetArrayFilters().

  • Elimina estos elementos de la matriz.

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))
{"description":"Matcha Latte","sizes":[12,16,20],"styles":["iced","",""]}

Para actualizar todos los elementos de la matriz, utilice el operador posicional $[].

Nota

Si especifica un filtro de consulta para el campo de la matriz, el operador posicional $[] ignora el filtro de consulta y actualiza todos los elementos de la matriz.

Este ejemplo multiplica cada elemento de la matriz en sizes por 29.57 para convertir de onzas a 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))
{"description":"Matcha Latte","sizes":[354,473,591],"styles":["iced","hot","extra hot"]}

Para obtener más información sobre las operaciones analizadas en esta guía, consulte las siguientes guías:

Para obtener más información sobre cualquiera de los métodos o tipos discutidos en esta guía, consultar la siguiente documentación de la API:

Volver

Modify

En esta página