微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用node.js的http服务器从mongodb返回大量的行?

我在mongodb中有一个用户数据库,我想通过JSON中的REST接口导出。问题在于,在最坏的情况下,返回行的数量超过了200万。

首先我试过这个

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({},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本机驱动程序和基本的Http包

Fatal error: CALL_AND_RETRY_2 Allocation Failed – process out of memory

(请注意,在实际情况下,我使用根据需要限制结果的参数,但此示例查询所有这是最坏情况下的情况,无论如何)

数据本身很简单,就像

{ “_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 }

我也尝试过类似的东西

while(cursor != null)
{
  cursor.nextObject(function(err,item) {
    response.write(JSON.stringify(item));
  });
}

但是这样也没有了。

我该怎么办?应该有一种方法来逐行流式传输数据,但是我还没有找到合适的示例。由于外部应用程序的要求,分页数据是不成问题的。我想把数据写入一个文件,然后发布,但这会导致不必要的io。

解决方法

不推荐使用本机MongoDB驱动程序的cursor.streamRecords()方法
方法stream()更快。

我已经解析了一个40,000,000行的acatalog文档,没有Mongodb流()process.nextTick()的问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐