Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

Actualizar arreglos en un documento

En esta guía, puedes aprender cómo actualizar elementos de un arreglo en uno o más documentos.

Para actualizar elementos en un arreglo, realiza las siguientes acciones:

  • Proporcionar un actualizar documento que especifica la actualización.

  • Especifica qué elementos del arreglo deben actualizarse.

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

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

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

La truncate etiqueta struct permite al controlador truncar tipos, como float64, a int32 al deserializar.

Para ejecutar los ejemplos en esta guía, carga 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 realizas una operación de guardar, el servidor las crea implícitamente.

Los siguientes ejemplos utilizan el método FindOneAndUpdate() para recuperar y actualizar un documento y para devolver el estado del documento después de que ocurra la actualización. Si deseas actualizar varios documentos con un campo de arreglo, utiliza el método UpdateMany().

Para especificar qué elementos del arreglo actualizar, utiliza un operador posicional. Los operadores posicionales pueden especificar el primer, varios, o todos los elementos de arreglo a actualizar.

Para especificar elementos de arreglo con un operador posicional, utiliza la notación de puntos. La notación de puntos es una sintaxis de acceso a propiedad para navegar por los elementos del arreglo y los campos 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 del arreglo en sizes donde el valor es menor o igual a 16.

  • Disminuye el primer valor del arreglo coincidente 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 query coincide con los valores 12 y 16. Dado que la operación coincide con 12 primero, se disminuye. Si quieres actualizar ambos valores coincidentes, consulta Varios elementos de arreglo.

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.

El <identifier> es el nombre que utilizas dentro de tu filtro de arreglo. Este valor debe comenzar con una letra minúscula y solo contener caracteres alfanuméricos.

Este ejemplo realiza las siguientes acciones:

  • Crea un filtro de arreglo con un identificador llamado hotOptions para coincidir con los elementos del arreglo que contienen "hot".

  • Aplica el filtro de arreglo con el método SetArrayFilters().

  • Elimina estos elementos del arreglo.

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 del arreglo, utiliza el operador posicional $[] all.

Nota

Si se especifica un filtro de query para el campo de arreglo, el operador posicional $[] ignora el filtro de query y actualiza todos los elementos del arreglo.

Este ejemplo multiplica cada elemento del arreglo 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 mencionadas en esta guía, consulta 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