Почему многоключевые индексы блокируют запросы indexOnly в MongoDB?

Я пытаюсь использовать только индекс при чтении данных из коллекции в MongoDB, потому что у меня есть несколько больших документов, в то время как для этого запроса мне нужно только одно поле.

Оказывается, у меня не может быть indexOnly = true, если индекс является многоключевым индексом.

Вот тест, который я сделал:

db.test.drop()
db.test.insert({a:1})
db.test.ensureIndex({a:1})
db.test.find({a:1}, {_id:0, a:1}).explain()

-> indexOnly = true, isMultiKey = false

db.test.insert({a : [2,3]})
db.test.find({a:1}, {_id:0, a:1}).explain()

-> indexOnly = false, isMultiKey = true

В документации упоминаются некоторые ограничения многоключевых индексов, но не этот. У кого-нибудь есть идеи, как использовать как multikey, так и indexonly?

2 ответа

Решение

От: http://docs.mongodb.org/manual/tutorial/create-indexes-to-support-queries/

Индекс не может покрыть запрос, если какое-либо из проиндексированных полей в любом из документов в коллекции содержит массив. Если индексированное поле является массивом, индекс становится индексом многоключевого индекса и не может поддерживать покрытый запрос.

Вы вставляете массив в свою тестовую коллекцию, поэтому, когда mongo создает индекс, он должен создать индекс MultiKey (это означает, что он создает индекс для каждого элемента массива).

Обратите внимание, что когда у вас есть запрос indexOnly, возвращаемый документ должен быть синтезирован только из информации в индексе. Это означает, что, не глядя на документ, правильный точный документ должен быть возвращен.

В случае индекса multiKey, запрос не знает, нужно ли возвращать
{ "a" : 1 }
или же
{ "a" : [ 1 ] }

Все, что он может сказать, это то, что "a" имеет значение 1, а индекс имеет тип multiKey. Нужно посмотреть в документе, чтобы сказать, является ли тип "a" это массив или число.

Другие вопросы по тегам