2014-10-24 2 views
1

В базе данных mongo у меня есть что-то вроде 4 миллионов документов (каждый документ состоит из отметки времени и значения).
У меня есть прецедент, где мне нужно иметь возможность запрашивать все документы через rest api. Я сделал sevreral тесты с sailsjs, используя паруса-монго или непосредственно node-mongodb-native в контроллере, но ни один из этих двух решений не работает, процесс зависает и никогда не возвращается.
Если я использую непосредственно оболочку mongo, я могу запросить всю коллекцию (конечно, она немного длинная, но это много данных).Не удается запросить всю коллекцию через паруса (sails-mongo или mongodb-native)

первый случай: от Монго оболочки

var v= db.data.find() 
v.length() => returns 4280183 in something like 30 sec 

В mongodb.log я могу видеть все «getmore» строки с числом элементов, возвращенных

2-й случай: от моего контроллера парусами (с помощью узла -mongodb родной)

// TEST WITH MONGODB NATIVE 
native_find: function(req, res){ 
    var MongoClient = require('mongodb').MongoClient; 
    var url = 'mongodb://localhost:27017/jupiter'; 
    MongoClient.connect(url, function(err, db) { 
     console.log("Connected correctly to server"); 

     var collection = db.collection('data'); 

     // Find all data 
     collection.find({}).toArray(function(err, d) { 
      db.close(); 
      res.json(d); 
     }); 
     }); 
    } 

процесс запускается, монго, кажется, работает, но через некоторое время у меня есть следующее сообщение об ошибке:

$ curl 'http://192.168.1.143:8000/native_find' 
curl: (52) Empty reply from server 

Если я зарегистрирую журнал монго, я могу увидеть некоторые getmore, но запросов для всей коллекции недостаточно.

третьего случая: от парусов контроллера через паруса-Монго ОРМ

// TEST WITH SAILS-MONGO 
sailsmongo_find: function(req, res){ 
    Data.find().exec(function(err, d){ 
     return res.json(d); 
    }); 
} 

Кажется, когда результаты полученные из Монго, несколько петель (карты в rewriteIDs и призыв к toJSON метода) на целом результатов (4,000 .000 раз ...) берут loooot времени и заставляют процесс зависать вечно ...

Любая идея о том, как иметь узел/монго для запроса на этот большой объем данных?

ответ

0

Это много данных для извлечения в одной операции, попробуйте получить данные в режиме async в пакетном процессе.

Возможно, вы можете ограничить результаты 100.000 o 200.000 и сохранить их в массиве, тогда вы можете попросить больше результатов.

Чтобы достичь этого, вы можете использовать async.

Смежные вопросы