mongoose里面的population 与 mongodb aggregate的$lookup相比,谁的性能更好?

发布于 2022-09-06 07:58:20 字数 363 浏览 16 评论 0

想问的三个问题

1.mongoose population的实现逻辑是什么?是封装了很多find,然后使用DBRefs模式进行查询的吗?
2.mongodb aggregate 是不是只查询IO了数据库一次?它的$lookup方法比起传统的 DBRefs ,在做多表关联查询时,是好还是快?为什么?
3.有没有什么办法可以监控程序对于mongodb的读写情况,测试出快慢。

备注: 个人认为mongoDB的aggregate $lookup 写起来太麻烦了。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

你爱我像她 2022-09-13 07:58:20

MongoDB has the join-like $lookup aggregation operator in versions >= 3.2. Mongoose has a more powerful alternative called populate(), which lets you reference documents in other collections.

DBRef只能根据ObjectId,并且有固定的格式要求,所以我倾向于认为它是构造了查询,在得到数据对象的时候再根据引用条件查询一次得到引用的对象。这样就造成一个不可避免的问题,如果一次查询返回结果集有10条记录,那么除了这些记录外还要进行10次额外的查询来获取引用它们的对象。性能上面肯定是大打折扣的。

  • $lookup的性能比DBRef好,它只进行一次查询来获取所有结果。但是这个运算符目前只能在复制集中使用,分片集暂不支持。
  • 程序对于MongoDB查询用了多少时间,当然要从程序端来监控。MongoDB端只会给出查询用了多少时间,很多时候消耗的大头还可能发生在网络上面。如果对数据库执行程序花了多长时间感兴趣,可以参考一下database profiler。但应该避免在生产环境进行profiling,因为它可能会对性能造成比较可观的影响。

总结一下,无论是$lookup还是DBRef,都是建议尽量避免的。我在这个问题里解释了正确的处理方式及原因,请参考。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文