【发布时间】: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 也可以通过批量编写插入来显着加快速度。意味着更少的数据库网络流量。