Tengo una tabla que contiene más de 100.000 registros. Servidor: node.js/express.js. DB: mongo En el cliente, se implementa una tabla con un buscapersonas. Se solicitan 10 registros cada vez.
Cuando había 10.000 registros, por supuesto, todo funcionaba más rápido, pero ahora había un problema con la velocidad y no solo.
Mi agregación:
import { concat } from 'lodash'; ... let query = [{$match: {}}]; query = concat(query, [{$sort : {createdAt: -1}}]); query = concat(query, [ {$skip : (pageNum - 1) * perPage}, // 0 {$limit : perPage} // 10 ]); return User.aggregate(query) .collation({locale: 'en', strength: 2}) .then((users) => ...;2 casos:
primera búsqueda muy lenta
cuando hago clic en la última página me sale el error:
MongoError: la ordenación excedió el límite de memoria de 104857600 bytes, pero no optó por la ordenación externa. Cancelación de la operación. Pase allowDiskUse:true para participar.
Por favor, dígame, estoy construyendo la agregación incorrectamente, o hay un problema con la memoria en el servidor como dice el error y se necesitan configuraciones nginx adicionales (otra persona está involucrada en esto) o el problema es complejo, o tal vez algo más ¿en total?
Agregado:
Noté que el índice no se usa al ordenar, aunque debería usarse.
agregación para ejecutar console.log =>
[ { "$match": {} }, { "$lookup": { ... } }, { "$project": { ..., createdAt: 1, ... } }, { "$match": {} }, { "$sort": { "createdAt": -1 } }, { "$skip": 0 }, { "$limit": 10 } ]Gracias por cualquier respuesta y lo siento mi inglés :)
Sí dice que tiene un límite de memoria, lo cual tiene sentido, considerando que está tratando de filtrar a través de 100,000 solicitudes. Intentaría usar return User.aggregate(query, { allowDiskUse: true }) //etc , y ver si eso soluciona su problema.
Si bien esta no es la documentación sobre el controlador Node.js específicamente, este enlace resume lo que hace la opción allowDiskUse (o, en resumen, permite que MongoDB supere el límite de memoria de 100 MB y utiliza el almacenamiento de su sistema para almacenar temporalmente cierta información mientras realiza la consulta).