在mongo数据库中,我有大约400万个文档(每个文档包含一个时间戳和一个值)。
我有一个用例,我需要能够通过rest api查询所有文档。我在控制器中使用sails-mongo或直接使用node-mongodb-native在sailsjs中进行了几次测试,但是这两个解决方案均未起作用,该过程挂起并且永不返回。
如果我直接使用mongo shell,则可以查询整个集合(当然,它有点长,但是数据很多)。
第一种情况:来自mongo shell
var v= db.data.find()
v.length() => returns 4280183 in something like 30 sec
在mongodb.log中,我可以看到所有“ getmore”行以及返回的项目数
第二种情况:来自我的Sails控制器(使用node-mongodb-native)
// 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);
});
});
}
该过程被触发,mongo似乎可以正常工作,但过了一会儿我遇到以下错误:
$ curl 'http://192.168.1.143:8000/native_find'
curl: (52) Empty reply from server
如果我检查mongo日志,则可以看到一些getmore,但是查询整个集合的次数不足。
第三种情况:从Sails控制器通过Sails-mongo ORM
// TEST WITH SAILS-MONGO
sailsmongo_find: function(req, res){
Data.find().exec(function(err, d){
return res.json(d);
});
}
似乎一旦从mongo中获取了结果,整个结果(4.000.000次...)上的几个循环(映射rewriteIDs并调用toJSON方法)就浪费了很多时间,并导致进程永久挂起。 。
关于如何使node / mongo用于查询如此大量数据的任何想法?
最佳答案
这是在单个操作中要检索的大量数据,请尝试以批处理的方式异步获取数据。
也许您可以将结果限制为100.000 o 200.000,然后将它们保存到数组中,然后您可以要求更多结果。
您可以使用async来实现。