Estoy trabajando con mongoose en node. Estoy haciendo solicitudes para recuperar una colección de elementos de una base de datos remota. Para obtener un informe completo, necesito analizar una colección completa, que es un conjunto grande.
Evito acercarme a cosas como:
model.find({}, function(err, data) { // process the bunch of data })Por ahora, uso un enfoque recursivo en el que introduzco una variable local. Más tarde envío información sobre el proceso como respuesta.
app.get('/process/it/',(req,res)=>{ var processed_data=[]; function resolve(procdata) { res.json({status:"ok", items:procdata.length}); } function handler(data, procdata, start, n) { if(data.length <= n) resolve(procdata); else { // do something with data: push into processed_data procdata.push(whatever); mongoose.model('model').find({}, function(err, data){ handler(data, procdata, start+n, n); }).skip(start).limit(n); } } n=0 mysize=100 // first call mongoose.model('model').find({}, function(err, data){ handler(data, processed_data, n, mysize); }).skip(n).limit(mysize); })¿Existe algún enfoque o solución que brinde alguna ventaja de rendimiento, o simplemente, para lograrlo de una mejor manera?
Cualquier ayuda sería apreciada.
La solución depende del caso de uso.
Si los datos una vez procesados no cambian con frecuencia, tal vez pueda tener una base de datos secundaria que tenga los datos procesados.
Puede cargar datos sin procesar desde la base de datos principal utilizando la paginación de la forma en que lo está haciendo ahora. Y todos los datos procesados se pueden cargar desde la base de datos secundaria en una sola consulta.
Está bien siempre que su conjunto de datos no sea lo suficientemente grande, aunque el rendimiento podría ser bajo. Cuando llegue al nivel de gigabytes, su aplicación simplemente fallará porque la máquina no tendrá suficiente memoria para almacenar sus datos antes de enviarlos al cliente. Además, el envío de gigabytes de datos de informes llevará mucho tiempo. Aquí algunas sugerencias: