Tôi có cơ sở dữ liệu người dùng trong mongodb mà tôi muốn xuất qua giao diện REST trong JSON. Vấn đề là trong trường hợp xấu nhất, số lượng hàng trả về là hơn 2 triệu.Làm thế nào để trả lại số lượng lớn hàng từ mongodb bằng cách sử dụng máy chủ http node.js?
Đầu tiên tôi đã cố gắng này
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');
mà thất bại khi chạy ra khỏi bộ nhớ. Ví dụ này sử dụng trình điều khiển gốc-mongod-node và gói http cơ bản.
FATAL ERROR: CALL_AND_RETRY_2 Allocation failed - process out of memory
(lưu ý rằng trong kịch bản thực tôi sử dụng các thông số mà giới hạn kết quả khi cần thiết, nhưng ví dụ này yêu cầu tất cả chúng mà là kịch bản trường hợp xấu nhất không phân biệt)
Các dữ liệu chính nó là đơn giản, giống như
{ "_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 }
tôi cũng đã cố gắng một cái gì đó giống như
while(cursor != null)
{
cursor.nextObject(function(err, item) {
response.write(JSON.stringify(item));
});
}
nhưng đó chạy ra khỏi bộ nhớ quá.
Tôi nên tiếp tục như thế nào? Nên có một cách để dòng dữ liệu theo hàng, nhưng tôi đã không thể tìm thấy một ví dụ phù hợp cho nó. Phân trang dữ liệu nằm ngoài câu hỏi vì yêu cầu ứng dụng bên ngoài. Tôi đã nghĩ đến việc ghi dữ liệu vào một tệp và sau đó đăng nó, nhưng điều đó dẫn đến io không mong muốn.
Tôi thấy rằng 'cursor.stream()' thực hiện chính xác giống như 'cursor.each()'. – Meekohi
Đảm bảo chỉ định giá trị cho 'batchSize' cho hàng nghìn hoặc hàng triệu hàng – alexishacks
Bạn có thể dán mã đầy đủ của mình vào đây – parkerproject