3

我有一个用于餐馆的 mongo db 集合。例如 {_id: uniquemongoid, rank: 3, city: 'Berlin' }

  1. 餐馆按城市列出并按等级(整数)排序​​ - 我应该创建一个关于城市和等级的索引,还是城市/等级复合?(我按城市查询并按排名排序)

  2. 此外,还有几个带有布尔值的字段,例如 { hasParking:true, familyFriendly:true } - 我应该创建索引来加快对这些过滤器的查询吗?复合索引?我不清楚是否应该创建复合索引,因为查询只能有一个布尔集或多个布尔集。

4

2 回答 2

4

确定是否需要索引的最佳方法是使用“explain()”对其进行基准测试。

至于您建议的索引:

  1. 您将需要城市/排名复合索引。MongoDB 中的索引只能用于从左到右(目前),因此对“城市”进行相等搜索,然后按“排名”对结果进行排序将意味着{ city: 1, rank: -1 }索引效果最好。

  2. 布尔字段上的索引通常不是很有用,因为平均而言 MongoDB 仍需要访问一半的文档。在按城市进行选择之后(希望是一个限制!)为 hasParking 等做一个额外的过滤器不会使 MongoDB 同时使用城市/排名和 hasParking 索引。MongoDB 每个查询只能使用一个索引。

于 2013-07-11T10:35:39.713 回答
2

1)创建索引 { restaurant:1, rank: 1} 这将服务于您的目的。

您将避免 2 个索引

2)创建以下格式的文档,您可以查询任何您想要的字段。

{
    info: [{hasParking:true}, {familyFriendly:true}],
    _id:
    rank:
    city:
}
db.restaurants.ensureIndex({info : 1});
db.restaurants.find({ info :{ hasParking:true}})
  • 注意 MongoDB 不会对同一个查询使用两个索引($or 查询除外)。因此,在 (2) 的情况下,如果您想在 (1) 查询上添加附加过滤器,则此 (2) 选项将不起作用。我不确定您的 (2) 要求,因此发布此解决方案。
于 2013-07-11T10:35:27.347 回答