有没有一种方法可以从MongoDB集合的文档中加载二进制数据而无需对其进行序列化?

时间:2020-09-23 00:33:20

标签: node.js mongodb

这是一个MongoDB查询函数,旨在递归调用该函数,以逐块加载集合中的所有文档。这些文档包含〜200字节的二进制数据。这种方法似乎能够以175 / ms的速率加载文档,而数据库在查询机上本地运行,而我可以以4500 / ms或更高的速率从文件中读取相同的数据。

我不希望在查询数据库时能胜过直接文件读取速度。但是,我只是确保没有更有效的方法来做到这一点。

我怀疑使用toArray()时在数据库上发生文档序列化为JSON的情况。也许有toArray()的另一种选择,可以将光标中每个文档的buffer属性通过concat放到单个缓冲区中,然后将原始二进制数据而不是JSON传递回去,通过网络传输文档。

The JSON format natively doesn't support binary data. The binary data has to be escaped so that it can be placed into a string element

而且由于我只对从查询的文档中检索二进制数据感兴趣,所以也许有更好的方法来跳过序列化?

function loadChunk(collection, chunksize, lastId) {
    return new Promise(resolve => {
      let promises = []
      if (!lastId) promises.push(this.db.collection(collection).find({}).limit(1)
      .toArray().then(items => {
          const id = items[0]._id.id
          lastId = items[0]._id
      }))
      // Promise.all is just used to either wait for the pre-query if it's
      // the first iteration of the func, or not if `lastId` is passed as
      // `loadChunk()` runs recursively with the `lastId` arg passed
      Promise.all(promises).then(() => {
        this.db.collection(collection).find({ _id: { $gt: lastId } }).limit(chunksize)
        .sort({_id: 1}).toArray().then(items => { 
          // the document format is { _id : ..., buffer: <buffer> } 
          // where .buffer is raw binary data
          resolve({
              lastId: items[items.length - 1]._id,
              items: items 
          })
        })
      })
    })
  }

是否有更好的方法来设计此查询功能以提高性能?

0 个答案:

没有答案