У меня есть пользовательская база данных в mongodb, которую я бы хотел экспортировать через интерфейс REST в JSON. Проблема в том, что в худшем случае количество возвращенных строк составляет более 2 миллионов.
Сначала я попробовал это
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');
который не работает при нехватке памяти. В примере используется node -mongodb-native драйвер и базовый http-пакет.
FATAL ERROR: CALL_AND_RETRY_2 Не удалось выполнить выделение - процесс из памяти
(обратите внимание, что в реальном сценарии я использую параметры, которые ограничивают результаты по мере необходимости, но этот пример запрашивает их все, что является наихудшим сценарием независимо)
Сами данные просты, например
{ "_id": ObjectId ( "4f993d1c5656d3320851aadb" ), "userid": "80ec39f7-37e2-4b13-b442-6bea57472537", "user-agent": "Mozilla/4.0 (совместимо; MSIE 8.0; Windows NT 5.1, Trident/4.0;.NET CLR 1.1.4322)", "ip": "127.0.0.1", "lastupdate": 1335442716}
Я также пробовал что-то вроде
while(cursor != null)
{
cursor.nextObject(function(err, item) {
response.write(JSON.stringify(item));
});
}
но это тоже закончилось.
Как мне продолжить? Должен быть способ потоковой передачи данных по строкам, но я не смог найти подходящий пример для него. Подкачка данных не может быть и речи из-за требований внешнего приложения. Я думал записать данные в файл, а затем публиковать его, но это приводит к нежелательным io.