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 に答える