为什么mongodb查询执行时间远低于使用node的实际结果



我在节点中有一个API端点,它使用一个简单的查询从mongodb中检索大约1.8MB的数据(大小显示在mongodb Compass中(。查询使用索引,解释计划显示查询执行时间几乎为0毫秒。但是,当我控制台记录在节点中检索数据的时间时,大约需要200毫秒。mongodb查找结果和在节点中获得结果之间发生了什么?有没有办法加快速度mongodb服务器与节点应用程序位于同一服务器上。以下是我如何在我的node/express路由中定时从mongodb检索:

app.get('/myRoute', function(req, res) {
//get mongodb connection client
const db = app.locals.db
//start timer
let start = new Date()
//query DB
db.collection("my_collection").find({year: 2019}).toArray()
.then((data)=> {
//log timer shows about 200 ms
console.log(new Date() - start)
res.writeHead(200, {'Content-Type': 'application/json'});
res.end(JSON.stringify(data))
})
})

我的猜测是,由于数据量相当大,所以从BSON转换为JS对象需要一段时间。如果是这样,无论如何要加快速度?我将其作为JSON发送到客户端,但最好是作为gzip JSON发送(以加快下载速度(。

数据是用于报告目的的,但查询mongodb->mongodb然后转换为JS对象->stringify到JSON->可能会对JSON->进行gzip处理,然后发送到客户端似乎效率很低。

在生产过程中,我使用了一个文件系统,其中包含许多带有预gzipped JSON的文件和文件夹,API会找到并发送到客户端。这很快,但很难维持。有什么想法吗?谢谢

如果比较在mongo上运行查询与通过节点运行查询所需的时间,我想您总是会有开销的。您可以尝试流式传输数据,而不是先加载数据,将其字符串化,然后再发送。这样的事情可能会有所帮助。

app.get('/myRoute', function(req, res) {
//get mongodb connection client
const db = app.locals.db
//start timer
console.time("start");
//query DB
const query = db.collection("my_collection").find({year: 2019});
query.stream().on("data", function (d) {
res.json(d);
});
query.stream().on("end", function () {
console.log("done"); res.end();
console.timeEnd("start");
});
})

bson-ext模块是用C++编写的另一个BSON解析器。它提供了更好的反序列化性能和与纯javascript解析器类似或更好的序列化性能。

https://mongodb.github.io/node-mongodb-native/3.4/installation-guide/installation-guide/#troubleshooting

请尝试安装bson-ext,然后再次检查。

JSON与BSON 的基准测试

最新更新