最近,我使用以下两个查询对我的快速服务器进行了压力测试:
db.collection.find(queryCondition).limit(1).toArray()
// and
db.collection.findOne(queryCondition)有人能解释为什么.find()显示MongoDB的快速事务时间而node.js却显示慢的事务时间吗?那么,与之形成完全对比的是,.findOne()显示出慢的MongoDB时间,但是快速的node.js时间?
对于上下文,我的快递服务器位于t2.微实例上,我的数据库位于另一个t2.
发布于 2020-09-11 14:25:45
让我们比较一下nodejs和mongodb级别上的.find()和.findOne()的性能。
MongoDb:
在这里,find().limit()应该是一个明显的赢家,因为它将游标取到结果,这是一个指向查询结果的指针,而不是数据本身,根据您的观察,情况正是如此。
Nodejs:
在这里,理论上,.find().limit()也应该出现得更快,但是,在您链接的“新遗迹结果”屏幕截图中,您实际上正在执行.find().limit().toArray()操作,它根据查询获取数据数组,而不仅仅是获取游标,而findOne()只是获取文档(以nodejs中的JS对象的形式)。
另一方面,根据nodejs的mongodb驱动程序文档,快速返回游标,因此是一个同步操作。不需要.then()或await,因为.toArray()是Cursor的一种方法,它在数组中获取与查询匹配的所有文档(与获取光标和将.next()可以自己获取的所有文档放在数组中没有什么不同)。根据查询的不同,这可能很费时,因此,它会返回一个承诺。
在您的测试中,似乎正在发生的是,使用.findOne(),您只获取一个文档(这在mongodb级别上是耗时的,在nodejs中也是如此),但是使用find(),您首先获取游标(在MongoDb级别上是快速的),然后告诉nodejs驱动程序从该游标中获取数据(耗时),这就是为什么.find().limit(1).toArray()看起来可能比nodejs中的findOne()更耗时,而且在链接的底部图中,空间几乎完全是蓝色的,这表示nodejs。
我建议您尝试简单地执行.find().limit()并检查结果,但是请注意,您不会得到实际的数据,只是一个cursor,在从它获取数据之前是非常无用的。
我希望这是有用的。
https://stackoverflow.com/questions/63843057
复制相似问题