Overview
En esta guía, aprenderá a utilizar el controlador de Rust para actualizar campos de tipo array en documentos de MongoDB.
Para actualizar un array en un documento, puede usar un operador de actualización y un operador posicional. Los operadores de actualización especifican el tipo de actualización que se va a realizar, y los operadores posicionales especifican qué elemento del array se va a actualizar.
Datos de muestra
Los ejemplos de esta guía utilizan los siguientes documentos de muestra en el
students colección:
{ "_id": 1, "student": "Kai Ling", "test_scores": [88, 62, 73] }, { "_id": 2, "student": "Francesca Miao", "test_scores": [95, 45, 67] }
Operador de posición
Utilice el operador posicional $ para actualizar el primer elemento de la matriz que coincida con su filtro de consulta. El operador $ representa la posición del primer elemento coincidente en la matriz.
El siguiente ejemplo utiliza el método update_one() para encontrar un documento en el que el array test_scores contiene el valor 62. A continuación, el ejemplo utiliza el operador posicional para actualizar el primer elemento coincidente de 62 a 65:
let filter = doc! { "test_scores": 62 }; let update = doc! { "$set": { "test_scores.$": 65 } }; let res = my_coll .update_one(filter, update) .await?; println!("Modified documents: {}", res.modified_count);
Modified documents: 1
El siguiente documento refleja los cambios resultantes de la operación de actualización anterior:
{ "_id": 1, "student": "Kai Ling", "test_scores": [88, 65, 73] }
Todos los operadores posicionales
Utilice el operador posicional $[] para actualizar todos los elementos de un campo de matriz. El operador $[] indica que la actualización se aplica a todos los elementos de la matriz.
El siguiente ejemplo utiliza el método update_one() para encontrar el documento en el que el valor del campo student es "Kai Ling". A continuación, el ejemplo utiliza el operador posicional all para incrementar cada valor en el array test_scores en 5:
let filter = doc! { "student": "Kai Ling" }; let update = doc! { "$inc": { "test_scores.$[]": 5 } }; let res = my_coll .update_one(filter, update) .await?; println!("Modified documents: {}", res.modified_count);
Modified documents: 1
La operación de actualización anterior genera un documento similar al siguiente:
{ "_id": 1, "student": "Kai Ling", "test_scores": [93, 67, 78] }
Operador de posición filtrado
Utilice el operador posicional filtrado $[<identifier>] para actualizar todos los elementos de la matriz que coincidan con un filtro de matriz. Un filtro de matriz es un documento que especifica qué elementos de la matriz se deben actualizar. Asigne <identifier> a un nombre de marcador de posición al que luego hará referencia en el filtro de matriz.
Para utilizar el operador posicional filtrado, encadene el método array_filters() a la llamada a su método de actualización y pase una matriz de documentos de filtro.
El siguiente ejemplo utiliza el método update_many() para encontrar todos los documentos en la colección students. A continuación, el ejemplo utiliza el operador posicional filtrado para agregar puntos 8 a todos los valores test_scores que son menores que 70:
let filter = doc! {}; let update = doc! { "$inc": { "test_scores.$[score]": 8 } }; let res = my_coll .update_many(filter, update) .array_filters(vec![doc! { "score": { "$lt": 70 } }]) .await?; println!("Modified documents: {}", res.modified_count);
Modified documents: 2
La operación de actualización anterior genera documentos similares a los siguientes:
{ "_id": 1, "student": "Kai Ling", "test_scores": [88, 70, 73] }, { "_id": 2, "student": "Francesca Miao", "test_scores": [95, 53, 75] }
Información Adicional
Para más información sobre los conceptos de esta guía, consulta la siguiente documentación:
Guía de actualizaciónde documentos
Para obtener más información sobre los operadores mencionados en esta guía, consulte la siguiente documentación del manual del servidor MongoDB:
Documentación de la API
Para obtener más información sobre los métodos y tipos mencionados en esta guía, vea la siguiente documentación de la API: