这是一个MongoDB查询函数,旨在递归调用该函数,以逐块加载集合中的所有文档。这些文档包含〜200字节的二进制数据。这种方法似乎能够以175 / ms的速率加载文档,而数据库在查询机上本地运行,而我可以以4500 / ms或更高的速率从文件中读取相同的数据。
我不希望在查询数据库时能胜过直接文件读取速度。但是,我只是确保没有更有效的方法来做到这一点。
我怀疑使用toArray()
时在数据库上发生文档序列化为JSON的情况。也许有toArray()
的另一种选择,可以将光标中每个文档的buffer
属性通过concat
放到单个缓冲区中,然后将原始二进制数据而不是JSON传递回去,通过网络传输文档。
而且由于我只对从查询的文档中检索二进制数据感兴趣,所以也许有更好的方法来跳过序列化?
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
})
})
})
})
}
是否有更好的方法来设计此查询功能以提高性能?