1

以下のシェルの例を参照してください (db.test が存在しないことを前提としています)。

db.test.ensureIndex({info: 1, _id: 1})
db.test.insert({info: "info1"})
db.test.insert({info: "info2"})
db.test.insert({info: "info3"})
db.test.find({info: "info1"}).explain().indexOnly //is false
db.test.find({info: "info1"}, {_id: 1, info: 1}).explain().indexOnly //is true

2 つのクエリは厳密に同等ですが、最初explainのクエリは 2indexOnly : false番目のクエリに含まれています。indexOnly : true

db.test.find({info: "info1"}) カバーされたクエリではないのはなぜですか?

4

1 に答える 1

4

私はこれをさらに考え、テストしてきましたが、今では理にかなっています。プロジェクションを追加しない場合、MongoDB は、持っているインデックスが実際にリターン全体を満たしているかどうかを「知る」方法がありません。ドキュメントを見ずに、インデックスがプロジェクションをカバーしていることをどのように知ることができますか?

SQLのselect *and と同じです。実際に見ずに、それが同じselect d,eであることをどのように知ることができますか?*d,e

プロジェクションを指定すると、MongoDB は、インデックスを見ると完全な結果セットが得られることを「知る」ことができますが、プロジェクションがなければそれはできません。

したがって、少し考えた後、これはバグではないと思います。これは単なる「癖」です。

于 2013-04-05T13:11:13.520 に答える