Me he encontrado con los momentos con la actualización de los elementos en una variedad de documentos.
Hasta ahora hay dos formas de implementar eso:
const product = await ProductModel.findOne({ _id: productID }); const price = product.prices.find( (price: any) => price._id == id ); if(!price) { return { type: 'ProductPriceError', code: 404, message: `Coundn't find price with provided ID: ${id}`, success: false, } } product.prices.pull({ _id: id }) product.prices.push(Object.assign(price, payload)) await product.save()El enfoque anterior no es atómico y no es muy cómodo, requiere muchas operaciones: 2 operaciones de entrada/salida con Mongoose y 2 manipulaciones con el documento de mangosta (tirar y empujar hacia atrás el elemento) y 1 búsqueda lineal del elemento que necesito modificar.
Y otro problema con este enfoque es que reemplaza completamente el elemento y cambia el orden de los elementos en la matriz.
Es demasiado detallado y no es una forma eficiente, pero le da más control sobre la operación.
Otra forma de completarlo es:
const product = await ProductModel.updateOne( { _id: productID, 'prices._id': id }, { $set: { 'prices.$': { ...payload, _id: id } } }, ) Entonces, aparentemente, solo puede usarlo con updateOne . Parece funcionar bien, pero si la consulta de búsqueda no encuentra el documento o un objeto en la matriz, fluye silenciosamente sin errores. Solo puede confiar en la respuesta con la cantidad de modificaciones que se realizaron durante la ejecución. nModified: 1 pero el estado de la operación es ok: 1 todos modos.
Cuando trato de usar { upsert: true } qué debería insertar los campos si no existen, finalmente arroja un error que indica que el operador posicional no puede encontrar el elemento para insertarlo. Eso resuelve un problema con el paso silencioso de la operación cuando no hay ningún elemento a modificar. Pero cualquiera, no es la forma en que debería funcionar, porque debería insertar un nuevo documento y crear los campos (sería lógico).
¿Cómo puedo con una sola operación (atómica) actualizar el documento en una matriz de un documento mangosta y devolver los documentos o campos actualizados?