3

我有一个国家文件,看起来像这样:

{
  "_id" : ObjectId("4e493af4140700590800154f"),
  "geoname_id" : "49518",
  "code" : "rw",
  "names" : {
    "en" : "Rwanda",
    "nl" : "Rwanda",
    "de" : "Ruanda"
  }
}

为了仅在查询时触摸索引:

db.countries.find({}, {"names.en":1, _id:0})

我添加了以下索引:

db.countries.ensureIndex({"names.en":1})

据我了解,查询现在应该只触及索引。但是, .explain() 告诉我查询根本没有使用任何索引:

{
  "cursor" : "BasicCursor",
  "nscanned" : 247,
  "nscannedObjects" : 247,
  "n" : 247,
  "millis" : 0,
  "nYields" : 0,
  "nChunkSkips" : 0,
  "isMultiKey" : false,
  "indexOnly" : false,
  "indexBounds" : {
  }
}

我认为原因可能是完整的数据库将被输出(247 个国家),但这对我来说没有任何意义。当国家/地区在索引中可用时,应该使用索引,对吗?

有人有想法吗?

干杯

4

3 回答 3

2

它不使用索引的原因是因为您没有根据任何条件进行查询。如果没有查找条件,查询优化器将不会选择要使用的索引,因此不能用作覆盖索引。

尝试db.countries.find({"names.en":"Rwanda"}, {"names.en":1, _id:0}).explain()使用索引标准验证它实际上会达到适当的索引。

可以为 MongoDB 提供一个案例,它需要足够聪明以实现它可以使用索引来满足原始查询,但目前它还没有。您也可以使用 .sort({"names.en":1}) 使其选择索引。

于 2011-08-16T08:36:55.790 回答
0

到目前为止,您可以提示 Mongo 使用您想要的索引(ref):

db.countries.find({}, {"names.en":1, _id:0}).hint({"names.en":1})

不过,我不确定何时添加此功能。

于 2013-02-18T21:21:05.583 回答
0

使用排序将确保它将使用索引,仅用于排序。

将“查找”和“排序”视为两个独立的操作。

于 2013-04-28T13:22:00.763 回答