gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:06:46 25 4
gpt4 key购买 nike

我在 mongodb 中有一个用户数据库,我想通过 JSON 中的 REST 接口(interface)导出它。问题是,在最坏的情况下,返回的行数远远超过 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-native 驱动程序和基本的 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() 方法更快。

我已经用 Mongodb + stream() + process.nextTick()

关于node.js - 如何使用node.js http服务器从mongodb返回大量行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10546193/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com