MongoDB按一个索引查询,按antoher排序

时间:2015-11-18 16:45:27

标签: mongodb

我的收藏中的文件的相关字段如下:

{
  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索引时,由于对坐标进行顺序扫描,查询速度太慢。

1 个答案:

答案 0 :(得分:0)

执行当前查询时,MongoDB只会使用point上的索引。运行find后,您将拥有一部分数据,因此Mongo无法再使用score上的索引。您可以在pointscore上创建一个综合索引,其中score按降序编制索引。即使第一个值是唯一的,它也有助于加快排序速度,因为MongoDB可以使用索引对score进行排序,而不必扫描整个文档(最大可达MB)。

复合索引遵循索引时的一般经验法则。通常,索引的顺序应为:

  1. 您将在其中查询确切值的字段。
  2. 您要对其进行排序的字段。
  3. 您将在其中查询一系列值的字段。
  4. 但是,根据你的评论,这个复合索引不是很快,这表明MongoDB无法将整个索引加载到内存中。你分配给MongoDB多少RAM?你有没有机会增加这个?