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

438
Views
Axios GET in for loop causando el error "Ordenar límite de memoria excedido"

Estoy tratando de cargar entradas de mi base de datos mongoDB una a la vez. Funciona para aproximadamente 400/1000 entradas y luego se rompe con el siguiente error:

Executor error during find command :: caused by :: Sort exceeded memory limit of 33554432 bytes, but did not opt in to external sorting. Aborting operation. Pass allowDiskUse:true to opt in.

Mi solicitud de obtención de Axios se ve así:

 for (let i = 0; i < total; i++) { await axios({ method: "GET", url: "/api/entries/", params: { from: index + i, _limit: 1 }, }) .then((res) => { setPics((prev) => { return [...new Set([...prev, ...res.data])]; }); setIndex((prev) => prev++) setMoreEntries(res.data.length > 0) }) }

y en mi controlador, mi función GET se ve así:

 const getEntries = asyncHandler(async (req, res) => { const entries = await Entry.find().allowDiskUse(true).sort({ createdAt: 'desc' }).skip(req.query.from).limit(req.query._limit) res.status(200).json(entries) })

Todo funciona perfectamente hasta que se han cargado aproximadamente la mitad de las entradas, luego se rompe. Pensé que agregar allowDiskUse(true) lo solucionaría, pero el mismo resultado.

Editar: debo mencionar que si .sort({ createdAt: 'desc' }) funciona perfectamente, pero se carga en el orden opuesto.

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

0

La sintaxis en sí está bien, no estoy muy seguro de por qué no funciona para usted.

Tengo dos teorías que podrían ser posibles:

  1. Está alojando su base de datos en Atlas y está utilizando instancias no calificadas para estas operaciones como se especifica en sus documentos :

Los clústeres gratuitos Atlas M0 y los clústeres compartidos M2/M5 no son compatibles con allowDiskUse

  1. Parece que está usando mongoose, tal vez esté usando una versión anterior que tiene un problema con este indicador de cursor o tiene una sintaxis diferente.

Independientemente de la fuente del problema, le recomiendo que lo resuelva de la siguiente manera:

  1. Cree un índice en createdAt , ordenar cuando existe un índice no escanea los documentos en la memoria, lo que hará que la consulta sea más eficiente y resolverá este problema.

  2. Simplemente use el índice _id y ordene con { _id: -1} , de su comentario sobre eliminar la operación de ordenación y obtener documentos en orden inverso, parece que su createdAt corresponde a la fecha de creación del documento (tiene sentido), el ObjectId _id está aumentando monótonamente lo que significa que puede usar ese campo para ordenar.

about 4 years ago · Juan Pablo Isaza Report

0

Terminé simplemente haciendo un bucle for hacia atrás y usando skip en lugar de ordenar, como

 const getOne = asyncHandler(async (req, res) => { const entry = await Entry.findOne({}, {}).allowDiskUse(true).skip(req.query.from) res.status(200).json(entry) })

Lo cual funcionó perfectamente para mí, pero la respuesta de Tom es lo que estaba buscando, 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!