使用缓冲区将流式JSON数据写入MongoDB

时间:2017-05-04 11:08:21

标签: json node.js mongodb stream buffer

我正在尝试通过JSONStream将流式JSON数据写入MongoDB。需要流,因为数据可能会变得非常大(可能高达数十GB),我想使用MongoDB的批量写入功能来进一步加快流程。要做到这一点,我需要缓冲数据,批量写入每1000个JSON对象左右。

我的问题是,当我缓冲数据的写入时,它不会写入所有数据并且遗漏了最后几千个对象。也就是说,如果我尝试编写100000个JSON对象,我的代码只能编写97000个JSON对象。我尝试使用类似的错误结果缓冲MongoDB批量写入和正常写入。

我的代码:

var JSONStream = require('JSONStream');
var mongodb = require('mongodb');

// DB connect boilerplate here

var coll = database.collection('Collection');
var bulk = coll.initializeOrderedBulkOp();
var bufferSizeLimit = 1000;
var recordCount = 0;
var jsonStream = JSONStream.parse(['items', true]);

jsonStream.on('data', (data) => {
  bulk.insert(data);
  recordCount++;

  // Write when bulk commands reach buffer size limit
  if (recordCount % bufferSizeLimit == 0) {
    bulk.execute((err, result) => {
      bulk = coll.initializeOrderedBulkOp();
    });
  }
});

jsonStream.on('end', () => {
  // Flush remaining buffered objects to DB
  if (recordCount % bufferSizeLimit != 0) {
    bulk.execute((err, result) => {
      db.close();
    });
  }
});

如果我用一个简单的MongoDB插入替换缓冲的写代码,代码就可以正常工作。这里有什么我想念的吗?

0 个答案:

没有答案