我在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({}, 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本机驱动程序和基本http包.

致命错误:调用和重试分配失败-进程内存不足

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

数据本身很简单,比如

{"_id":ObjectId("4F993D1C56D3320851AADB"),"userid:"80ec39f7-37e2-4b13-b442-6BEA5742537","用户代理":"Mozilla/4.0(兼容;MSIE 8.0;Windows NT 5.1;Trident/4.0;.NET CLR 1.1.4322)","ip:"127.0.0.1","最新更新":1335442716}

我也试过类似的方法

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

但那也没什么记忆了.

我该怎么做?应该有一种方法来逐行传输数据,但我还没有找到合适的例子.由于外部应用程序的要求,分页数据是不可能的.我曾想过将数据写入一个文件,然后将其发布,但这会导致不必要的io.

推荐答案

本机MongoDB驱动程序的cursor.streamRecords()方法已被弃用,

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

Mongodb相关问答推荐

MongoDB:子文档中仅存在于父文档中的返回字段?

MongoDB聚合$group阶段$top与$first在大型数据集上的效率

如何在 MongoDB 中的集合下查找同一文档

MongoDB - 在 $lookup 管道中匹配键匹配不起作用

在 DBeaver 中连接到 Redis 或 MongoDB

Meteor 方法与deny/allow 规则

无法提取地理键,经度/纬度超出范围

你如何在 Kubernetes 上设置 Mongo 副本集?

MongoDB 中 cursor.count() 和 cursor.size() 之间的区别

字段类型在 MongoDB 索引中是否重要?

django 和 mongodb 是否使迁移成为过go ?

如何在我的Meteor 应用程序数据库中使用 mongoimport?

Mongoose 不创建新集合

NoSQL:MongoDB 或 BigTable 并不总是 Available意味着什么

带有 Java 驱动程序的 MongoDB 聚合

如何在 golang 和 mongodb 中通过 id 查找

Mongodb 按字段名称查找任何值

将日期从毫秒转换为 ISODate 对象

在mongoose中创建和查找地理位置

findOneAndUpdate 中的文档未更新