2013-04-05 1 views
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 

Первый explain имеет indexOnly : false в то время как второй имеет indexOnly : true хотя два запроса строго эквивалентны.

Почему нет db.test.find({info: "info1"})a covered query?

+0

Скорее всего, это сложность оптимизатора запросов mongo, оптимизатор не будет проверять охваченный индекс, если есть проекция – Sammaye

+1

Чтобы добавить, я бы поставил это на http://jira.mongodb.org, потому что это похоже на оптимизатор должен пытаться использовать закрытый запрос здесь, но, очевидно, оптимизатор не обнаруживает этого. – Sammaye

+1

это явно не ошибка и не причуда. эти два вопроса никоим образом не являются, форма или форма «строго эквивалентны». Их результаты по ДАННОМУ ДАННОМУ СОСТОЯНИЮ «строго эквивалентны». Но сам запрос совершенно другой. Один говорит «вернуть весь документ», а другой говорит «вернуть эти два значения поля из документа». –

ответ

4

Я уже думал и тестировал это, и теперь это имеет смысл. Если вы не добавляете прогноз, MongoDB не имеет никакого способа «знать», если индекс, который вы действительно заполняете, полностью возвращает; Я имею в виду, как он может знать, что индекс охватывает проекцию, не глядя на документы?

Это то же самое, что и у select * и select d,e в SQL. Как вы узнали, что * - это то же самое, что и у d,e?

Если вы поставили проекцию, MongoDB может «знать», что просмотр индекса даст вам полный набор результатов, однако без проекции он не сможет.

Итак, после некоторого размышления я не думаю, что это ошибка, это просто «причуда».

+0

Это действительно имеет большое значение. Там может быть документ где-то с дополнительным полем, не захваченным индексом. – assylias