我的收藏中的文件的相关字段如下:
{
point: {
type: Point,
coordinates: [15.6446464, 45.231323]
}
score: 24
}
我在2dsphere
上有一个point
索引,在score
上有#34;正常",降序索引。
我想运行以下查询:
db.properties.find({point: {$geoWithin: <some polygon> }}).sort({score: -1}).limit(2000)
有没有办法让mongo在point
部分find
上使用索引,然后在score
上使用索引进行排序?
该集合有大约700k文档,查找部分可以返回数万个文档,每个文档最多有一个MB。
当前的问题是,当使用point
索引时,返回的集合的大小对于在内存中进行排序来说太大了。使用score
索引时,由于对坐标进行顺序扫描,查询速度太慢。
答案 0 :(得分:0)
执行当前查询时,MongoDB只会使用point
上的索引。运行find
后,您将拥有一部分数据,因此Mongo无法再使用score
上的索引。您可以在point
和score
上创建一个综合索引,其中score
按降序编制索引。即使第一个值是唯一的,它也有助于加快排序速度,因为MongoDB可以使用索引对score
进行排序,而不必扫描整个文档(最大可达MB)。
复合索引遵循索引时的一般经验法则。通常,索引的顺序应为:
但是,根据你的评论,这个复合索引不是很快,这表明MongoDB无法将整个索引加载到内存中。你分配给MongoDB多少RAM?你有没有机会增加这个?