为啥我的 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 聚合查询这么慢的主要内容,如果未能解决你的问题,请参考以下文章