首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么.find()显示快速MongoDB事务时间&慢node.js事务时间,而.findOne()显示完全相反的情况?

问为什么.find()显示快速MongoDB事务时间&慢node.js事务时间,而.findOne()显示完全相反的情况?
EN

Stack Overflow用户
提问于 2020-09-11 07:59:49
回答 1查看 350关注 0票数 3

最近,我使用以下两个查询对我的快速服务器进行了压力测试:

代码语言:javascript
复制
db.collection.find(queryCondition).limit(1).toArray()

// and

db.collection.findOne(queryCondition)

这些是新的遗迹结果。

有人能解释为什么.find()显示MongoDB的快速事务时间而node.js却显示慢的事务时间吗?那么,与之形成完全对比的是,.findOne()显示出慢的MongoDB时间,但是快速的node.js时间?

对于上下文,我的快递服务器位于t2.微实例上,我的数据库位于另一个t2.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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,在从它获取数据之前是非常无用的。

我希望这是有用的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63843057

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档