Mongodb 聚合 $lookup 和 group 非常非常慢
Posted
技术标签:
【中文标题】Mongodb 聚合 $lookup 和 group 非常非常慢【英文标题】:Mongodb aggregate $lookup and group is very very slow 【发布时间】:2020-10-05 01:31:31 【问题描述】:我在 mongodb 上使用聚合。 此聚合获取与“user.isLogin : true”匹配的文档数。
db.getCollection('example').aggregate([
$lookup:
from: "users",
localField: "userId",
foreignField: "userId",
as: "user"
,
$match: user.isLogin : true,
$unwind:user
$count: "total_count"
])
这个聚合现在需要超过 4 秒。 当我删除 $count 时,需要 0.064 秒。
当我使用 $count 时,如何将速度提高到 0.173 秒? 我知道 $count 与 $group:_id: null, total_count:$sum: 1 相同,所以这个问题是如何在 $lookup 阶段之后加快 $group 阶段?
谢谢大家。
【问题讨论】:
如果没有$count,数据库需要返回最大批量大小的结果,因此它不必计算完整的结果集。使用 $count,即使输出较小(一个数字而不是多个文档),数据库也必须计算完整的结果集。 你的话对我来说超出了。那么解决方案是什么?我们如何减少查找和组聚合的时间?这是 mongo 聚合严重错误吗? 【参考方案1】:将$match
与$lookup
交换。当您首先$lookup
时,您首先查找所有文档,然后过滤它们。如果先过滤它们,查找文档的数量会减少,因此性能会提高。
【讨论】:
我应该在匹配之前先添加查找,因为匹配正在使用查找和连接的对象。感谢您的第一个建议以上是关于Mongodb 聚合 $lookup 和 group 非常非常慢的主要内容,如果未能解决你的问题,请参考以下文章
MongoDB 单个 $lookup / 聚合查询以列出用户和用户分配为成员的团队
MongoDB 聚合 $lookup 不适用于 $group
Mongodb聚合$lookup $project和$match不起作用[重复]