【问题标题】:Way to iterate through entire mongo database that is too large to load? [duplicate]遍历整个太大而无法加载的mongo数据库的方法? [复制]
【发布时间】:2016-01-06 14:12:42
【问题描述】:

我必须为我公司的一位客户进行一些数据处理。他们有一个大约 4.7GB 数据的数据库。我需要为使用 mongo 文档的两个属性和外部参考计算的每个文档添加一个字段。

我的问题是,我不能执行 collection.find() 因为 Node.js 内存不足。遍历一个太大而无法通过一次调用来加载的整个集合的最佳方法是什么?

【问题讨论】:

标签: node.js mongodb database


【解决方案1】:

是的,有办法。 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);
};

【讨论】:

  • 很好的答案,但是我问如何在 node.js 中做到这一点,而不是在 mongo 控制台中。 cmets 中的链接问题有更好的答案,因此我将其标记为重复。
  • 与 cursor 的 forEach 方法相比如何?
  • 目前获取文档的方法是next(),而不是getNext()
  • 感谢@StevenSpungin。我改了
  • 在运行此脚本的同时有写入的实时数据库如何工作。新文档是否会包含在迭代中?我也认为这会锁定数据库并且我应该在每次更新之间添加一个超时时间吗?
猜你喜欢
  • 1970-01-01
  • 2015-06-19
  • 2014-12-11
  • 2019-07-30
  • 1970-01-01
  • 2021-11-27
  • 1970-01-01
  • 1970-01-01
  • 2018-02-21
相关资源
最近更新 更多