流式传输数据并写入MongoDB

时间:2015-04-11 12:28:13

标签: node.js mongodb express

刚开始调查从一台服务器到另一台服务器的流数据。我使用REQUEST,我已经能够将数据从文件PUT到另一个服务器上,如下所示:

...
push: function(argv) {
  fs.createReadStream('source_test.json').pipe(request.put('https://path/to/server/'));
}
...

//server-side
router.put('/', function (req, res, next) {
  req.pipe(fs.createWriteStream('dest_test.json'));
  res.status(200).end();
});

这很好用。现在我想将内容写入MongoDB而不是文件。我写得好#34;正常数据"到MongoDB,但我想知道将流数据写入数据库的典型方法是什么。我假设我必须等到流式传输完成然后写入数据库?

非常感谢任何建议,包括使代码更加健壮的建议。

1 个答案:

答案 0 :(得分:1)

我们假设您以JSON文档的形式流式传输数据。

如果您要传输单个JSON文档,那么在传递它并发送到MongoDB驱动程序之前,您必须等待它到达。

但是如果您要传输一组文档,那么您应该能够在第一个文档到达后立即开始处理它们。

首先,有两种方法可以传输大量的JSON文档:

  • 使用换行符分隔的JSON文档列表(即每行是有效的JSON文档)
  • 使用单个JSON数组

解析换行符分隔的JSON数据

您可以使用event-stream module解析它:

var es = require('event-stream')

req
  .pipe(es.split())
  .pipe(es.parse())
  .pipe(es.map(function (doc, next) {
    collection.insert(doc, next);
  }))

您可以使用相同的模块从MongoDB流式传输数据。以下是使用mongoose执行此操作的示例:

collection
  .find()
  .stream()
  .pipe(es.stringify())
  .pipe(request.put(uri))

解析JSON数组

从流中解析JSON数组是一项更困难的任务,但您可以使用JSONStream module执行此操作:

req
  .pipe(JSONStream.parse('*'))
  .pipe(es.map(function (doc, next) {
    collection.insert(doc, next);
  }))

从MongoDB流式传输数据:

collection
  .find()
  .stream()
  .pipe(JSONStream.stringify())
  .pipe(request.put(uri))

NB 确保您没有使用[body-parser中间件]或任何其他尝试为您解析传入的JSON数据的中间件,因为它会使所有权益无效使用JSONStream