【发布时间】:2021-02-21 00:37:00
【问题描述】:
如何在 nodeJS 中有效地缓冲从流到批量插入的事件,而不是从流中接收到的每条记录的唯一插入。这是我想到的伪代码:
// Open MongoDB connection
mystream.on('data', (record) => {
// bufferize data into an array
// if the buffer is full (1000 records)
// bulk insert into MongoDB and empty buffer
})
mystream.on('end', () => {
// close connection
})
这看起来真实吗? 有没有可能的优化?现有的图书馆能提供这样的便利吗?
【问题讨论】:
-
nodejs 原生的
streamapi 听起来很合适,你应该考虑使用 Writable。缓冲区的大小可以通过设置 highWaterMark 来控制。可写类有一个final()函数,一旦流完成就会调用该函数。这可以用来关闭数据库连接。 -
感谢您的回答,我也考虑过该选项,这可能是解决该问题的最佳方法,您输入的数据越多,放入缓冲区的数据越多,您收到的数据就越多在缓冲区中将自动填充 MongoDB 数据库,我假设您还可以通过这种方式控制数据流,并使进入输入的数据自动销毁。我计划通过这种方法使用从小到大的数据集(从几 kb 到 5-10gb 的流数据)
-
MongoDB 的本机驱动程序(和 Mongoose API)都公开了一个 DB 游标接口,该接口可以封装为 stream.Readable (
stream.Readable.from()),然后通过管道传输到缓冲区 Writable。因此,脚本获取的数据不会超过它可以存储在其可写缓冲区中的数据。
标签: javascript node.js mongodb stream buffer