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

441
Vistas
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 Respuestas
Responde la pregunta

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 Denunciar

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 Denunciar
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