Перемещение 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" 
      ] 
    ] 
  }
}


Вопросы:

  1. Почему не работает индексирование, нужно ли что-то еще делать?
  2. Является ли индексирование Multikey в этом случае полезным? (Я предполагаю, что да.)
  3. Есть ли другая форма индексации, которая была бы более полезной?



Редактировать:
Я только что заметил, что в RockMongo explain В данных есть поле:"isMultiKey": true,
Может ли быть так, что используются Multikeys, и я совершенно не понял, что он индексируется?

1 ответ

Решение

Как вы говорите в своем редактировании, и исходя из части объяснения, которую вы не опубликовали, является то, что isMulyiKey: true вместе с другой информацией на курсоре показывается, что индекс используется. indexBounds еще один показатель.

IndexOnly описывает тот факт, что ваш запрос содержит другое поле, name, который не является частью индекса. Когда оптимизатор запросов видит, что все элементы запроса могут быть выполнены с помощью полей из индекса, это называется закрытым запросом, и indexOnly свойство здесь установлено в true.

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

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