Overview
En esta guía, puede aprender a usar el controlador Ruby para actualizar documentos en una colección MongoDB mediante el uso de update_one y update_many métodos.
Datos de muestra
Los ejemplos de esta guía utilizan la colección restaurants en la base de datos sample_restaurants de la Conjuntos de datos de muestra de Atlas. Para acceder a esta colección desde su aplicación Ruby, cree un Mongo::Client objeto que se conecte a un clúster de Atlas y asigne los siguientes valores a las variables database collection y:
database = client.use('sample_restaurants') collection = database[:restaurants]
Para aprender cómo crear un clúster gratuito de MongoDB Atlas y cargar los conjuntos de datos de muestra, consulte la guía de introducción a MongoDB.
Operaciones de actualizar
Puede actualizar documentos en MongoDB utilizando los siguientes métodos:
update_one:Actualiza el primer documento que coincide con los criterios de búsquedaupdate_many:Actualiza todos los documentos que coinciden con los criterios de búsqueda
Cada método de actualización requiere los siguientes parámetros:
Filtro de consulta, que coincide con los documentos que desea actualizar. Para obtener más información sobre los filtros de consulta, consulte Especifique una guía de consulta.
Documento de actualización, que especifica el operador de actualización y los campos y valores que se actualizarán. El operador de actualización especifica el tipo de actualización que se realizará. Para ver una lista de operadores de actualización y conocer sus usos, consulte la página de la guía "Operadores de actualización de campos" en el manual de MongoDB Server.
Ejemplo de actualización de un documento
El siguiente ejemplo utiliza el método update_one para encontrar el primer documento cuyo valor del campo name sea "Happy Garden". A continuación, utiliza el operador $set para actualizar el valor del campo name a "Mountain House".
filter = { name: 'Happy Garden' } update = { '$set' => { name: 'Mountain House' } } single_result = collection.update_one(filter, update) puts "#{single_result.modified_count} document(s) updated."
1 document(s) updated
Ejemplo para actualizar muchos documentos
El siguiente ejemplo utiliza el método update_many para actualizar todos los documentos cuyo valor del campo name es "Starbucks". El documento de actualización utiliza el operador $rename para cambiar el nombre del campo address a location.
filter = { name: 'Starbucks' } update = { '$rename' => { address: 'location' } } many_result = collection.update_many(filter, update) puts "#{many_result.modified_count} document(s) updated."
11 document(s) updated
Opción de inserción o actualización
El parámetro upsert le permite utilizar las operaciones update_one() y update_many() para realizar una operación condicional:
Si el documento especificado existe, el comando lo actualiza.
Si el documento especificado no existe, el comando creará un nuevo documento con el parámetro especificado.
Para obtener más información, consulte la sección Modificar ejemplo de actualización o la tabla de opciones en esta página.
Personalizar la operación de actualización
Los métodos update_one y update_many aceptan opciones para configurar la operación de actualizar. Puede enviar estas opciones individualmente como parámetros, o puede crear un objeto Hash que contenga las opciones y pasar el objeto como parámetro. Si no especificas ninguna opción, el driver realiza la operación de actualización con la configuración por defecto.
La siguiente tabla describe las opciones que puede utilizar para configurar la operación de actualización:
Opción | Descripción |
|---|---|
| Whether the update operation performs an upsert operation if no
documents match the query filter. For more information, see the upsert
statement
in the MongoDB Server manual. Default: false |
| Whether the update operation bypasses document validation. This lets you
update documents that don't meet the schema validation requirements, if any
exist. For more information about schema validation, see Schema
Validation in the MongoDB
Server manual. Default: false |
| Language collation to use when sorting
results. For more information, see Collation
in the MongoDB Server manual. |
| List of filters that you specify to select which
array elements the update applies to. |
| Index to use when matching documents.
For more information, see the hint statement
in the MongoDB Server manual. |
| Map of parameter names and values to set top-level
variables for the operation. Values must be constant or closed
expressions that don't reference document fields. For more information,
see the let statement in the
MongoDB Server manual. |
Ejemplo de modificación y actualización
El ejemplo utiliza el operador $equal para buscar coincidencias en documentos cuyo valor del campo name sea "Sunrise Pizzeria". A continuación, utiliza el operador $set para establecer el valor del campo borough en el primer documento coincidente en "Queens" y el valor del campo cuisine en "Italian".
Debido a que la opción upsert está configurada como true, si el filtro de query no coincide con ningún documento existente, el driver inserta un nuevo documento que contiene los campos y valores en los documentos de filtro y actualizaciones.
filter = { 'name' => 'Sunrise Pizzeria' } update = { '$set' => { borough: 'Queens', cuisine: 'Italian' } } upsert_result = collection.update_one(filter, update, upsert: true) puts "#{upsert_result.modified_count} document(s) updated."
1 document(s) updated
Valor de retorno
Los métodos update_one y update_many devuelven cada uno un objeto Result. Puede acceder a los siguientes métodos desde una instancia Result:
Método | Descripción |
|---|---|
| Number of documents that matched the query filter, regardless of
how many updates were performed. |
| Number of documents modified by the update operation. If an updated
document is identical to the original, it is not included in this
count. |
| Returns true if the server acknowledged the result. |
| Returns the number of documents that were upserted in the database, if the driver
performed an upsert. |
| Returns the _id value of the document that was upserted
in the database, if the driver performed an upsert. |
Tip
Compruebe el valor del método acknowledged? antes de intentar llamar a cualquier otro método Result. Si el método acknowledged? devuelve false, el controlador genera una excepción InvalidOperation si intenta llamar a cualquier otro método en el objeto Result. El controlador no puede determinar estos valores si el servidor no confirma la operación de escritura.
Información Adicional
Para ver ejemplos de código ejecutables que demuestran cómo actualizar documentos mediante el controlador Ruby, consulte Insertar documentos.
Documentación de la API
Para aprender más sobre cualquiera de los métodos o tipos analizados en esta guía, consulta la siguiente documentación de API: