Tengo una base de datos de usuario en mongodb que me gustaría exportar a través de una interfaz REST en JSON. El problema es que, en el peor de los casos, la cantidad de filas devueltas supera ampliamente los 2 millones.¿Cómo devolver una gran cantidad de filas de mongodb utilizando el servidor http nodeNo.js?
Primero probé este
var mongo = require('mongodb'),
Server = mongo.Server,
Db = mongo.Db;
var server = new Server('localhost', 27017, {auto_reconnect: true});
var db = new Db('tracking', server);
var http = require('http');
http.createServer(function (request, response) {
db.collection('users', function(err, collection) {
collection.find({}, function(err, cursor){
cursor.toArray(function(err, items) {
output = '{"users" : ' + JSON.stringify(items) + '}';
response.setHeader("Content-Type", "application/json");
response.end(output);
});
});
});
}).listen(8008);
console.log('Server running at localhost:8008');
el que falla cuando se ejecuta fuera de la memoria. El ejemplo usa el controlador node-mongodb-native y el paquete http básico.
FATAL ERROR: CALL_AND_RETRY_2 Allocation failed - process out of memory
(Nótese que en escenario real utilizo parámetros que limitan los resultados según sea necesario, pero este ejemplo les consulta todos, que es el peor de los casos, independientemente)
Los datos en sí es simple, como
{ "_id" : ObjectId("4f993d1c5656d3320851aadb"), "userid" : "80ec39f7-37e2-4b13-b442-6bea57472537", "user-agent" : "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322)", "ip" : "127.0.0.1", "lastupdate" : 1335442716 }
también probé algo así como
while(cursor != null)
{
cursor.nextObject(function(err, item) {
response.write(JSON.stringify(item));
});
}
pero que se quedó sin memoria también
¿Cómo debo proceder? Debería haber una manera de transmitir los datos fila por fila, pero no he podido encontrar un ejemplo adecuado para ello. Paginar los datos está fuera de cuestión debido a los requisitos de aplicaciones externas. Pensé en escribir los datos en un archivo y luego publicarlo, pero eso lleva a IO no deseado.
Encontré que 'cursor.stream()' realiza exactamente lo mismo que 'cursor.each()'. – Meekohi
Asegúrese de especificar un valor para 'batchSize' para miles o millones de filas – alexishacks
Puede pegar el código completo aquí – parkerproject