【发布时间】:2014-12-20 10:48:08
【问题描述】:
在 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 用于查询大量数据的任何想法?
【问题讨论】:
标签: node.js mongodb scalability sails.js