Перемещение MongoDB в Multikeys, но indexOnly возвращает false
То, что я пытаюсь сделать, звучит логично для меня, однако я не уверен.
Я пытаюсь улучшить часть коллекции MongoDB с помощью Multikeys.
Например: у меня есть несколько документов в следующем формате:
Документ:
{
"_id": ObjectId("528a4177dbcfd00000000013"),
"name": "Shopping",
"tags": [
"retail",
"shop",
"shopping",
"store",
"grocery"
]
}
Запрос:
До сих пор я использовал следующий запрос, чтобы соответствовать tags
поле.
var tags = Array("store", "shopping", "etc");
db.collection.findOne({ 'tags': { $in: tags } }, { name: true });
Это работает хорошо, однако я думаю, что в этом случае следует использовать Multikeys для улучшения скорости и производительности. Пожалуйста, поправьте меня, если я ошибаюсь!
Индексация:
Я выполнил следующую команду в попытке индексировать tags
,
db.collection.ensureIndex( { tags: 1 }, { safe: true }, function(err, doc) {} );
ensureIndex
Был успешен.
Результат:
Однако при использовании RockMongo's explain
функция по вышеуказанному запросу, результат:
{
"indexOnly": false,
"indexBounds": {
"tags": [
[
"etc",
"etc"
],
[
"shopping",
"shopping"
],
[
"store",
"store"
]
]
}
}
Вопросы:
- Почему не работает индексирование, нужно ли что-то еще делать?
- Является ли индексирование Multikey в этом случае полезным? (Я предполагаю, что да.)
- Есть ли другая форма индексации, которая была бы более полезной?
Редактировать:
Я только что заметил, что в RockMongo explain
В данных есть поле:"isMultiKey": true,
Может ли быть так, что используются Multikeys, и я совершенно не понял, что он индексируется?
1 ответ
Как вы говорите в своем редактировании, и исходя из части объяснения, которую вы не опубликовали, является то, что isMulyiKey: true
вместе с другой информацией на курсоре показывается, что индекс используется. indexBounds
еще один показатель.
IndexOnly описывает тот факт, что ваш запрос содержит другое поле, name
, который не является частью индекса. Когда оптимизатор запросов видит, что все элементы запроса могут быть выполнены с помощью полей из индекса, это называется закрытым запросом, и indexOnly
свойство здесь установлено в true.
Таким образом, в идеальной ситуации ваш запрос и результаты используют информацию только из индекса, и MongoDB также не нужно искать запись из индекса в коллекции, чтобы вернуть больше данных.