【发布时间】: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 索引。我会试试你的建议
标签: database mongodb mongoose indexing