Почему многоключевые индексы блокируют запросы 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"
это массив или число.