Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

97
Vistas
Actualización de objeto en una matriz de documentos mangosta

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?

about 4 years ago · Juan Pablo Isaza
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda