Overview
You can modify documents in a MongoDB collection by using update and replace operations. Update operations modify the fields and values of a document while keeping other fields and values unchanged. Replace operations substitute all fields and values in an existing document with specified fields and values while keeping the _id field value unchanged.
El driver de Node.js ofrece los siguientes métodos para modificar documentos:
updateOne()updateMany()replaceOne()
To learn how to replace documents, see the Guía dereemplazo de documentos.
Tip
Interactive Lab
Esta página incluye un breve laboratorio interactivo que demuestra cómo modificar datos usando el método updateMany(). Puede completar este laboratorio directamente en la ventana de su navegador sin instalar MongoDB o un editor de código.
Para iniciar el laboratorio, haga clic en el Open Interactive Tutorial Botón en la parte superior de la página. Para ampliar el laboratorio a pantalla completa, haga clic en el botón de pantalla completa (⛶) en la esquina superior derecha del panel del laboratorio.
Update Documents
Para realizar una actualización en uno o más documentos, crear un documento de actualización que especifique el operador de actualización (el tipo de actualización a realizar) y los campos y valores que describen el cambio. Actualizar los documentos utilizando el siguiente formato:
{ <update operator>: { <field> : { ... }, <field> : { } }, <update operator>: { ... } }
El nivel superior de un documento de actualización contiene uno o más de los siguientes operadores de actualización:
$set: reemplaza el valor de un campo con uno especificado$inc: incrementa o disminuye los valores de los campos$rename: cambia el nombre de los campos$unset: remueve campos$mul: multiplica el valor de un campo por un número especificado
See the MongoDB Server manual for a complete list of update operators and their usage.
Los operadores de actualización se aplican solo a los campos asociados con ellos en su documento de actualización.
Nota
Pipelines de agregación en operaciones de actualización
Si se está utilizando la versión 4.2 de MongoDB o posterior, se pueden usar pipelines de agregación compuestas por un subconjunto de etapas de agregación en las operaciones de actualización. Para aprender más sobre las etapas de agregación que MongoDB admite en las pipelines de agregación utilizadas en las operaciones de actualización, se puede consultar nuestro tutorial sobre cómo construir actualizaciones con pipelines de agregación.
Ejemplo
Considere un documento en la colección myDB.items con campos que describen un artículo en venta, su precio y la cantidad disponible:
{ _id: 465, item: "Hand-thrown ceramic plate", price: 32.50, quantity: 7, }
Si se aplica el operador para actualizar $set con un nuevo valor para quantity, se puede utilizar el siguiente documento para actualizar:
const myDB = client.db("myDB"); const myColl = myDB.collection("items"); const filter = { _id: 465 }; // update the value of the 'quantity' field to 5 const updateDocument = { $set: { quantity: 5, }, }; const result = await myColl.updateOne(filter, updateDocument);
El documento actualizado se asemeja al siguiente, con un valor actualizado en el campo quantity y todos los demás valores sin cambios:
{ _id: 465, item: "Hand-thrown ceramic plate", price: 32.50, quantity: 5, }
Si una operación para actualizar no logra coincidir con ningún documento en una colección, no se realiza ningún cambio. Las operaciones de actualización se pueden configurar para realizar una inserción que intenta llevar a cabo una actualización, pero si no coincide ningún documento, inserta un nuevo documento con los campos y valores especificados.
No se puede modificar el campo _id de un documento ni cambiar un campo a un valor que infrinja una restricción de índice único. Consultar el manual de MongoDB Server para obtener más información sobre índices únicos.
Ejemplo de updateOne(): Archivo completo
Nota
Configuración de ejemplo
Este ejemplo se conecta a una instancia de MongoDB con un URI de conexión. Para obtener más información sobre cómo realizar la conexión a la instancia de MongoDB, se debe consultar la guía Conexión a MongoDB. Este ejemplo también usa la colección movies en la base de datos sample_mflix incluida en los conjuntos de datos de muestra de Atlas. Se pueden cargar en la base de datos en el nivel gratuito de MongoDB Atlas siguiendo la guía de Introducción a MongoDB.
Este ejemplo utiliza el operador de actualización $set que especifica los valores de actualización para los campos de documentos. Para aprender más sobre los operadores de actualización, se puede consultar la documentación de referencia de los operadores de actualización de MongoDB.
El siguiente código es un archivo completo y autónomo que realiza una operación de actualizar:
1 // Update a document 2 3 import { MongoClient } from "mongodb"; 4 5 // Replace the uri string with your MongoDB deployment's connection string 6 const uri = "<connection string uri>"; 7 8 const client = new MongoClient(uri); 9 10 async function run() { 11 try { 12 const database = client.db("sample_mflix"); 13 const movies = database.collection("movies"); 14 15 // Create a filter for movies with the title "Random Harvest" 16 const filter = { title: "Random Harvest" }; 17 18 /* Set the upsert option to insert a document if no documents match 19 the filter */ 20 const options = { upsert: true }; 21 22 // Specify the update to set a value for the plot field 23 const updateDoc = { 24 $set: { 25 plot: `A harvest of random numbers, such as: ${Math.random()}` 26 }, 27 }; 28 29 // Update the first document that matches the filter 30 const result = await movies.updateOne(filter, updateDoc, options); 31 32 // Print the number of matching and modified documents 33 console.log( 34 `${result.matchedCount} document(s) matched the filter, updated ${result.modifiedCount} document(s)`, 35 ); 36 } finally { 37 // Close the connection after the operation completes 38 await client.close(); 39 } 40 } 41 // Run the program and print any thrown errors 42 run().catch(console.dir);
1 // Update a document 2 3 import { MongoClient } from "mongodb"; 4 5 // Replace the uri string with your MongoDB deployment's connection string 6 const uri = "<connection string uri>"; 7 8 const client = new MongoClient(uri); 9 10 // Define the Movie interface 11 interface Movie { 12 plot: string; 13 title: string; 14 } 15 16 async function run() { 17 try { 18 const database = client.db("sample_mflix"); 19 const movies = database.collection<Movie>("movies"); 20 21 /* Update a document that has the title "Random Harvest" to have a 22 plot field with the specified value */ 23 const result = await movies.updateOne( 24 { title: "Random Harvest" }, 25 { 26 $set: { 27 plot: `A harvest of random numbers, such as: ${Math.random()}`, 28 }, 29 }, 30 /* Set the upsert option to insert a document if no documents 31 match the filter */ 32 { upsert: true } 33 ); 34 35 // Print the number of matching and modified documents 36 console.log( 37 `${result.matchedCount} document(s) matched the filter, updated ${result.modifiedCount} document(s)` 38 ); 39 } finally { 40 // Close the connection after the operation completes 41 await client.close(); 42 } 43 } 44 // Run the program and print any thrown errors 45 run().catch(console.dir);
Al ejecutar el ejemplo anterior, se produce el siguiente resultado:
1 document(s) matched the filter, updated 1 document(s)
Ejemplo de updateMany(): Archivo completo
Nota
Configuración de ejemplo
Este ejemplo se conecta a una instancia de MongoDB con un URI de conexión. Para obtener más información sobre cómo realizar la conexión a la instancia de MongoDB, se debe consultar la guía Conexión a MongoDB. Este ejemplo también usa la colección movies en la base de datos sample_mflix incluida en los conjuntos de datos de muestra de Atlas. Se pueden cargar en la base de datos en el nivel gratuito de MongoDB Atlas siguiendo la guía de Introducción a MongoDB.
El siguiente código es un archivo completo y autónomo que realiza una operación de actualización múltiple:
1 /* Update multiple documents */ 2 3 import { MongoClient } from "mongodb"; 4 5 // Replace the uri string with your MongoDB deployment's connection string 6 const uri = "<connection string uri>"; 7 8 const client = new MongoClient(uri); 9 10 async function run() { 11 try { 12 // Get the "movies" collection in the "sample_mflix" database 13 const database = client.db("sample_mflix"); 14 const movies = database.collection("movies"); 15 16 // Create a filter to update all movies with a 'G' rating 17 const filter = { rated: "G" }; 18 19 // Create an update document specifying the change to make 20 const updateDoc = { 21 $set: { 22 random_review: `After viewing I am ${ 23 100 * Math.random() 24 }% more satisfied with life.`, 25 }, 26 }; 27 // Update the documents that match the specified filter 28 const result = await movies.updateMany(filter, updateDoc); 29 console.log(`Updated ${result.modifiedCount} documents`); 30 } finally { 31 // Close the database connection on completion or error 32 await client.close(); 33 } 34 } 35 run().catch(console.dir);
1 /* Update multiple documents */ 2 3 import { MongoClient } from "mongodb"; 4 5 // Replace the uri string with your MongoDB deployment's connection string. 6 const uri = "<connection string uri>"; 7 8 const client = new MongoClient(uri); 9 10 enum Rating { 11 G = "G", 12 PG = "PG", 13 PG_13 = "PG-13", 14 R = "R", 15 NR = "NOT RATED", 16 } 17 18 // Create a Movie interface 19 interface Movie { 20 rated: Rating; 21 random_review?: string; 22 } 23 24 async function run() { 25 try { 26 // Get the "movies" collection in the "sample_mflix" database 27 const database = client.db("sample_mflix"); 28 const movies = database.collection<Movie>("movies"); 29 30 // Update all documents that match the specified filter 31 const result = await movies.updateMany( 32 { rated: Rating.G }, 33 { 34 $set: { 35 random_review: `After viewing I am ${ 36 100 * Math.random() 37 }% more satisfied with life.`, 38 }, 39 } 40 ); 41 console.log(`Updated ${result.modifiedCount} documents`); 42 } finally { 43 // Close the database connection on completion or error 44 await client.close(); 45 } 46 } 47 run().catch(console.dir);
Al ejecutar el ejemplo anterior, se verá un resultado como el siguiente:
Updated 477 documents
Documentación de la API
Para aprender más sobre cualquiera de los tipos o métodos discutidos en esta guía, consulta la siguiente documentación de la API: