Overview
Si su aplicación almacena y modifica datos en MongoDB, probablemente utilice operaciones de inserción y actualización. En ciertos flujos de trabajo, la realización de una operación de inserción o actualización depende de si el documento existe. En estos casos, puede optimizar la lógica de su aplicación utilizando
upsert Opción disponible en los siguientes métodos:
Si el filtro de query pasado a estos métodos no encuentra ninguna coincidencia y se establece la opción upsert en true, MongoDB inserta el documento de actualización. Vamos a revisar un ejemplo.
Realizar una actualización
Supongamos que la aplicación rastrea la ubicación actual de los camiones de comida, almacenando los datos de la dirección más cercana en la colección myDB.foodTrucks, que se asemeja a lo siguiente:
[ { name: "Haute Skillet", address: "42 Avenue B" }, { name: "Lady of the Latke", address: "35 Fulton Rd" }, ... ]
Como usuario de la aplicación, se lee sobre el cambio de ubicación habitual de un camión de comida y se desea aplicar la actualización. Esta actualización podría asemejarse a lo siguiente:
const myDB = client.db("myDB"); const myColl = myDB.collection("foodTrucks"); const query = { name: "Deli Llama" }; const update = { $set: { name: "Deli Llama", address: "3 Nassau St" }}; const options = {}; const result = await myColl.updateOne(query, update, options);
Si existe un camión de comida llamado "Deli Llama", llamar al método anterior actualizará el documento en la colección. Sin embargo, si no hay camiones de comida llamados "Deli Llama" en la colección, no se realizan cambios.
Realizar una inserción
Se debe considerar el caso en el que se desea añadir información sobre el camión de comida aunque aún no exista en la colección. En lugar de consultar primero si existe para determinar si insertar o actualizar el documento, podemos establecer upsert a true en nuestra llamada a updateOne() de la siguiente manera:
const query = { name: "Deli Llama" }; const update = { $set: { name: "Deli Llama", address: "3 Nassau St" }}; const options = { upsert: true }; const result = await myColl.updateOne(query, update, options);
Después de ejecutar la operación anterior, su colección tendrá un aspecto similar al siguiente, incluso si el documento "Deli Llama" no existía en la colección antes de la operación:
[ { name: "Haute Skillet", address: "42 Avenue B" }, { name: "Lady of the Latke", address: "35 Fulton Rd" }, { name: "Deli Llama", address: "3 Nassau St" }, ... ]