Смотрите пример оболочки ниже (предполагается, что 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?
Скорее всего, это сложность оптимизатора запросов mongo, оптимизатор не будет проверять охваченный индекс, если есть проекция – Sammaye
Чтобы добавить, я бы поставил это на http://jira.mongodb.org, потому что это похоже на оптимизатор должен пытаться использовать закрытый запрос здесь, но, очевидно, оптимизатор не обнаруживает этого. – Sammaye
это явно не ошибка и не причуда. эти два вопроса никоим образом не являются, форма или форма «строго эквивалентны». Их результаты по ДАННОМУ ДАННОМУ СОСТОЯНИЮ «строго эквивалентны». Но сам запрос совершенно другой. Один говорит «вернуть весь документ», а другой говорит «вернуть эти два значения поля из документа». –