首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用node.js http服务器从mongodb返回大量的行?

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

Stack Overflow用户
提问于 2012-05-11 14:02:15
回答 5查看 14.5K关注 0票数 18

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

首先,我尝试了这个

代码语言:javascript
复制
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包。

致命错误: CALL_AND_RETRY_2分配失败-进程内存不足

(请注意,在实际场景中,我使用了根据需要限制结果的参数,但本例查询了所有这些参数,这是最坏的情况)

数据本身很简单,比如

{ "_id“:ObjectId("4f993d1c5656d3320851aadb"),"userid”:"80ec39f7-37e2-4b13-b442-6bea57472537",“用户代理”:"Mozilla/4.0 (兼容;MSIE8.0;Windows NT 5.1;Trident/4.0;.NET CLR 1.1.4322)","ip“:"127.0.0.1","lastupdate”:1335442716 }

我也试过像这样的东西

代码语言:javascript
复制
while(cursor != null)
{
  cursor.nextObject(function(err, item) {
    response.write(JSON.stringify(item));
  });
}

但这也耗尽了内存。

我应该如何继续?应该有一种逐行流式传输数据的方法,但我还没有找到合适的示例。由于外部应用程序的要求,数据分页是不可能的。我想将数据写到一个文件中,然后发布它,但这导致了不想要的io。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-12-13 03:45:34

本机MongoDB驱动程序的cursor.streamRecords()方法已弃用,stream()方法速度更快。

我已经解析了一个4000万行的acatalog文档,使用Mongodb + stream() + process.nextTick()没有任何问题

票数 15
EN

Stack Overflow用户

发布于 2012-05-14 12:36:53

我发现node-mongodb-native Cursor对象也有一个记录的流选项(与collection.find().streamRecords()一起使用),即使在github page of the driver中没有提到它。查看Cursor source code并搜索"streamRecords“。

最后,代码是这样结束的:

代码语言:javascript
复制
db.collection('users', function(err, collection) {
  var first = true;

  response.setHeader("Content-Type", "application/json");
  response.write('{"users" : [');

  var stream = collection.find().streamRecords();

  stream.on('data', function(item) {
    var prefix = first ? '' : ', ';
    response.write(prefix + JSON.stringify(item));
    first = false;
  });
  stream.on('end', function() {
    response.write(']}');
    response.end();
  });
});
票数 8
EN

Stack Overflow用户

发布于 2012-05-11 15:25:04

这样的应该可以让正常工作。如果没有,您可能应该在mongodb-native bug tracker中打开一个问题。

代码语言:javascript
复制
http.createServer(function (request, response) {
  db.collection('users', function(err, collection) {
    collection.find({}, function(err, cursor){
      response.setHeader("Content-Type", "application/json");
      cursor.each(function(err, item) {
        if (item) {
          response.write(JSON.stringify(item));
        } else {
          response.end();
        }
      });
    });
  });
}).listen(8008);

PS:这只是一个存根,我的意思是我不记得确切的语法,但它是你要找的each函数。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10546193

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档