Overview
Si tu aplicación almacena y modifica datos en MongoDB, probablemente utilices operaciones de inserción y actualización. En determinados flujos de trabajo, el hecho de realizar una operación de inserción o actualización depende de si existe el documento. En estos casos, puedes simplificar la lógica de tu aplicación utilizando el
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 query = { name: 'Deli Llama' }; const update = { $set: { name: 'Deli Llama', address: '3 Nassau St' } }; const options = {}; 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 }; 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" }, ... ]