【问题标题】:MongoDB only stores 61246 documents?MongoDB 只存储 61246 个文档?
【发布时间】:2014-11-12 03:30:47
【问题描述】:

我是 MongoDB 的新手,在通过 NodeJs 将一堆文档插入我的集合时遇到了一些问题。

我有一个文件列表(全部小于 100kb)要插入到同一个集合中。我使用以下代码:

var files = walkFolder(base);
var url = 'mongodb://localhost:27017/enron';

MongoClient.connect(url, function(err, db) {
    if (err) { throw err;}
    var collection = db.collection('emails');
    async.each(files, function(item, callback){
            var document = readEmail(item);
            collection.insert(document, function(err, result) {
                    console.log(result);
                    callback(err);
            });
    });
});

walkFolder() 创建文件列表,readEmail() 将单个文件解析为 JSON 对象(只是一些属性,没有嵌入文档或其他东西)

我可以执行我的程序,而且它运行的时间很长。但总是在集合中正好有 61246 个文档(通过 > db.emails.find().count() 检查)计数不再增加。

知道为什么会发生这种情况或如何追踪它吗? 一些版本:MacOS 10.9.5、NodeJs 0.10.31、MongoDB 驱动程序 1.4.19、MongoDB 2.6.5

【问题讨论】:

  • 虽然这基本上可以通过对排队的并发插入数量设置“限制”来解决,但我可以建议walkFolder() 在这里仍然是一个问题,因为它显然是在一个大数组中读取的。您可能需要考虑将其实现为node stream 接口以减少内存并在那里进行“节流”。 MongoDB 的Bulk API 也可以通过批量编写插入来显着加快速度。意味着更少的数据库网络流量。

标签: node.js mongodb


【解决方案1】:

async.each 将迭代器函数并行应用于每个 files 元素。如果files 很大,您可以尝试一次完成所有操作,从而耗尽各种资源。相反,使用 async.eachLimit 一次只处理 N 个元素。

例如,要将处理中的文件限制为不超过 10 个,请将您的 async.each 调用替换为:

async.eachLimit(files, 10, function(item, callback){ ...

【讨论】:

  • 非常感谢。与此同时,我正在玩其他东西并尝试了eachSeries - 这使它绝对是连续的,但也解决了敲击资源的问题。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-04
  • 1970-01-01
  • 2012-06-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多