【发布时间】:2016-01-06 14:12:42
【问题描述】:
我必须为我公司的一位客户进行一些数据处理。他们有一个大约 4.7GB 数据的数据库。我需要为使用 mongo 文档的两个属性和外部参考计算的每个文档添加一个字段。
我的问题是,我不能执行 collection.find() 因为 Node.js 内存不足。遍历一个太大而无法通过一次调用来加载的整个集合的最佳方法是什么?
【问题讨论】:
-
太棒了,我将其标记为重复。
我必须为我公司的一位客户进行一些数据处理。他们有一个大约 4.7GB 数据的数据库。我需要为使用 mongo 文档的两个属性和外部参考计算的每个文档添加一个字段。
我的问题是,我不能执行 collection.find() 因为 Node.js 内存不足。遍历一个太大而无法通过一次调用来加载的整个集合的最佳方法是什么?
【问题讨论】:
是的,有办法。 Mongo 旨在处理大型数据集。
您可能内存不足,不是因为db.collection.find(),而是因为您试图用db.collection.find().toArray() 之类的东西一次全部转储。
对大于内存的结果集进行操作的正确方法是使用游标。以下是您在 mongo 控制台中的操作方式:
var outsidevars = {
"z": 5
};
var manipulator = function(document,outsidevars) {
var newfield = document.x + document.y + outsidevars.z;
document.newField = newfield;
return document;
};
var cursor = db.collection.find();
while (cursor.hasNext()) {
// load only one document from the resultset into memory
var thisdoc = cursor.next();
var newnoc = manipulator(thisdoc,outsidevars);
d.collection.update({"_id": thisdoc['_id']},newdoc);
};
【讨论】:
next(),而不是getNext()。