为啥我的 MongoDB 聚合查询这么慢

Posted

技术标签:

【中文标题】为啥我的 MongoDB 聚合查询这么慢【英文标题】:Why is my MongoDB aggregation query so slow为什么我的 MongoDB 聚合查询这么慢 【发布时间】:2021-03-12 13:14:34 【问题描述】:

我需要从数据库中获取多个用户 ID(通常为 2 或 3 个)。问题是,我还需要知道到某个点的距离。问题是,我的集合中有 1,000,000 个文档(用户),获取用户需要超过 30 秒。

为什么会这样?当我将$in 运算符用于_id 时,它可以正常工作并在200 毫秒内返回所有内容,而当我只使用$geoNear 运算符时,它也可以正常工作,但是当我将两者一起使用时,一切都会变慢.我该怎么办?同样,我所需要的只是一些具有来自userIds 数组的 ID 及其与某个点 (user.location) 的距离的用户。

编辑:还想提一下,当我使用 $nin 而不是 $in 时,查询也可以正常执行。只有$in$geoNear 结合使用会导致问题

const user = await User.findById('logged in users id');
const userIds = ['id1', 'id2', 'id3'];

[
    
        $geoNear: 
            near: user.location,
            distanceField: 'distance',
            query: 
                _id:  $in: userIds 
            
        
    
]

【问题讨论】:

您在 ID 或地理空间字段上是否有任何索引? 如果您运行db.coll.explain().aggregate(yourPipeline),您可能会发现它没有使用_id 索引(仅2dIndex)。而且你不能进行比赛,因为它必须是第一阶段。您只能尝试与其他一些操作员一起解决。另外,我怀疑如果你添加$project:geolocationField:1,它会运行得更快,但你应该测试一下,看看这将变得多么无用。 @AliDowair 如果没有地理空间索引,查询将无法运行 该位置确实有一个 2dsphere 索引。我会试试你的建议 【参考方案1】:

我找到了一个解决方法:我只是通过 ID 字段进行查询,然后我使用一个库来确定返回的文档到中心点的距离。

【讨论】:

【参考方案2】:

索引您的数据可能是您的问题的解决方案。没有索引 mongodb 必须扫描所有文档。

【讨论】:

我有一个 ID 和 location 字段的索引。这就是为什么我很困惑,考虑到两者都被索引,为什么需要这么长时间?无论如何,我找到了答案中所述的解决方法。无论如何感谢您的输入

以上是关于为啥我的 MongoDB 聚合查询这么慢的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 MySQL 组这么慢?

运行查询时,mongo上的聚合函数运行速度非常慢

mongoDB应用篇-mongo聚合查询

mongodb高级聚合查询

mongodb高级聚合查询

Spring Mongo 聚合查询以从 MongoDB 获取不同的国家名称和国家代码