Overview
En esta guía, puedes aprender a usar el driver Ruby para actualizar documentos en una colección de MongoDB utilizando los métodos update_one y update_many.
Datos de muestra
Los ejemplos de esta guía utilizan la colección restaurants en la base de datos sample_restaurants de los conjuntos de datos de muestra de Atlas. Para acceder a esta colección desde tu aplicación Ruby, crea un objeto Mongo::Client que se conecte a un clúster de Atlas y asigna los siguientes valores a tus variables database y collection:
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 ejemplo, consulta la guía MongoDB Get Started.
Operaciones de actualizar
Puedes actualizar documentos en MongoDB utilizando los siguientes métodos:
update_oneActualizar el primer documento que coincida con los criterios de búsquedaupdate_many: actualiza todos los documentos que cumplen con los criterios de búsqueda
Cada método de actualización requiere los siguientes parámetros:
filtro de query, que hace coincidir los documentos que deseas actualizar. Para obtener más información sobre los filtros de query, consulta la guía Especificar una query.
Actualizar documento, que especifica el operador de actualización y los campos y valores a actualizar. El operador de actualización especifica el tipo de actualización a realizar. Para ver una lista de operadores de actualización y aprender sobre 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 donde el valor del campo name sea "Happy Garden". Luego 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 usa el método update_many para actualizar todos los documentos en los que el 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 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 Ejemplo de modificación de actualización o la tabla de opciones en esta página.
Personaliza la operación de actualizar
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 se pueden utilizar para configurar la operación de actualización:
Opción | Descripción |
|---|---|
| Indica si la operación de actualización realiza una operación de inserción/actualización si ningún documento coincide con el filtro de consulta. Para obtener más información, consulte la instrucción `upsert` en el manual del servidor MongoDB. |
| Indica si la operación de actualización omite la validación del documento. Esto permite actualizar documentos que no cumplen con los requisitos de validación del esquema, si los hubiera. Para obtener más información sobre la validación del esquema, consulte Validación de esquema en el manual del servidor MongoDB. |
| Intercalación de idiomas que se utilizará al ordenar los resultados. Para obtener más información, consulte la sección "Intercalación" en el manual del servidor MongoDB. |
| Lista de filtros que usted especifica para seleccionar a qué elementos de la matriz se aplica la actualización. |
| Índice que se utilizará para la búsqueda de documentos. Para obtener más información,consulte la instrucción de sugerencia en el manual del servidor MongoDB. |
| Mapa de nombres y valores de parámetros para definir las variables de nivel superior de la operación. Los valores deben ser constantes o expresiones cerradas que no hagan referencia a campos del documento. Para obtener más información, consulte la instrucción `let` en el manual del servidor MongoDB. |
Modificar ejemplo de actualización
El ejemplo utiliza el operador $equal para hacer coincidir los documentos donde el valor del campo name es "Sunrise Pizzeria". Luego 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 |
|---|---|
| Número de documentos que coincidieron con el filtro de la consulta, independientemente de cuántas actualizaciones se hayan realizado. |
| Número de documentos modificados por la operación de actualización. Si un documento actualizado es idéntico al original, no se incluye en este recuento. |
| Devuelve |
| Devuelve el número de documentos que se insertaron o actualizaron en la base de datos, si el controlador realizó una operación de inserción o actualización. |
| Devuelve el valor |
Tip
Verifique 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 se intenta llamar a cualquier otro método en el objeto Result. El driver no puede determinar estos valores si el servidor no reconoce la operación de guardado.
Información Adicional
Para ver ejemplos de código ejecutables que demuestran cómo actualizar documentos utilizando el driver de Ruby, consulta 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: