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不起作用[重复]

Mongodb聚合$lookup $project和$match不起作用[重复]

使用聚合 $lookup 加入 mongodb

MongoDb:聚合 $lookup