Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

275
Views
¿Por qué Mongoose updateMany() solo funciona cuando se usa .then?

Estoy aprendiendo Mongoose y no puedo encontrar en la documentación, ni en otras preguntas en este sitio, por qué updateMany() necesita tener un .then() al final para ejecutarse.

Como ejemplo, aquí está el código que estoy tratando de ejecutar, con el objetivo de cambiar la calificación de las películas realizadas en 1992 y 2019.

 Movie.updateMany({year: {$in: [1992,2019]}}, {rating: 'M'}).then(data => console.log(data));

Estas son las películas en cuestión:

 { "_id" : ObjectId("6282e0d37a9a5a4851d465b1"), "title" : "Elton Pan", "year" : 2013, "score" : 10, "rating" : "M", "__v" : 0 } { "_id" : ObjectId("6282e0d37a9a5a4851d465b2"), "title" : "Pon Porom", "year" : 2019, "score" : 0, "rating" : "M", "__v" : 0 } { "_id" : ObjectId("6282e0d37a9a5a4851d465b3"), "title" : "The Night", "year" : 1992, "score" : 10, "rating" : "R", "__v" : 0 }

Si intento ejecutar el código sin .then , al final, nada cambia.

También he visto a personas usar este método sin .then al final, lo que me hace preguntarme si no puedo usarlo de esta manera debido a la versión de Mongoose que estoy usando.

Solo para aclarar, estoy verificando los resultados a través del shell de Mongo y no intento recuperar los resultados dentro del código.

Gracias de antemano, y perdón por la pregunta de novato :)

about 4 years ago · Juan Pablo Isaza
3 answers
Answer question

0

Aprendí de la publicación de @Mats a continuación que updateMany no funciona sin .then porque devuelve un Objeto de consulta Mongoose, no la Promesa destinada a actualizar los datos. Tienen una función .then() para co y async/await como conveniencia. Si necesita una promesa completa, use la función .exec() . Lea la publicación de @Mats a continuación para obtener más información.

Mi respuesta cuando pensé que devuelve la Promesa:

En realidad, actualiza los datos, pero para que tengas los datos actualizados, debes esperar, ya que una Promesa es una tarea que comienza y finaliza más tarde. .then te permite decir, Quiero saber cuándo se completa la tarea que pedí.

Para comprender Promise en JavaScript, puede ver este video de Youtube o usar el enlace anterior para leer sobre él en MDN. Es un concepto clave en JavaScript. La documentación de Mongoose no habla sobre por qué están usando .then porque asumen en este punto que tienes una pista al respecto.

about 4 years ago · Juan Pablo Isaza Report

0

No necesita un .then() para ejecutarse. Se ejecuta muy bien cuando haces esto:

 Movie.updateMany({year: {$in: [1992,2019]}}, {rating: 'M'})

Simplemente aún no tiene acceso a los resultados porque es una operación asíncrona. La función devuelve una promesa. .then() espera a que se resuelva la promesa, luego le da el resultado como el primer parámetro de devolución de llamada de .then() .

Recomiendo usar async...await sintaxis. Tener un montón de basura de encadenamiento de promesas .then() no es bueno, especialmente hoy en día.

 // wrapped it in an automatically invoked async function (async () => { const data = await Movie.updateMany({year: {$in: [1992,2019]}}, {rating: 'M'}) console.log(data) })()
about 4 years ago · Juan Pablo Isaza Report

0

Creo que pude haber encontrado una explicación a la pregunta .then . Citando a Zarko, un profesor en el curso (de Udemy) que estoy haciendo:

La consulta de mangosta no debería devolver una promesa real de forma predeterminada, sino un objeto de consulta que se pueda ejecutar. Básicamente, mongoose brinda soporte para devoluciones de llamada, promesas y la sintaxis async/await cuando se trabaja con consultas asíncronas. La consulta de mongoose en sí misma devolverá un objeto de 'consulta' de mangosta que tiene su propio .then (por lo que es como un envoltorio personalizado de mangosta sobre promesas regulares), y cuando le agregamos .then activamos la ejecución de esa consulta . Puede consultar los documentos de mongoose aquí: https://mongoosejs.com/docs/promises.html#queries-are-not-promises

Puede consultar este artículo: https://masteringjs.io/tutorials/mongoose/promise

Entonces, como se menciona en la documentación, también podemos encadenar la llamada al método .exec() después de la consulta para obtener la promesa completa - Mongoose - ¿Qué hace la función exec?

Entonces, básicamente, el .then o .exec es necesario para desencadenar la ejecución de esa consulta (cuando no se usa async...await ). Al menos eso es lo que entiendo de la respuesta del profesor.

Esta es mi primera publicación, y no estoy seguro de si debería haber publicado esto como una respuesta o editado mi propia pregunta para incluir esta explicación, agradecería sus comentarios. Gracias.

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!