Может ли индекс подполя охватывать запросы на проекции этого поля? - PullRequest
0 голосов
/ 08 октября 2019

Представьте, что у вас есть такая схема:

[{
  name: "Bob",
  naps: [{
    time: 2019-05-01T15:35:00,
    location: "sofa"
  }, ...]
 }, ...
]

Так много людей, каждый из которых имеет несколько дюжин дремоты. Вы хотите узнать, «в какие дни люди больше всего дремлют?», Поэтому вы индексируете naps.time, а затем запрашиваете:

aggregate([
  {$unwind: naps}, 
  {$group: { _id: {$day: "$naps.time"}, napsOnDay: {"$sum": 1 } }
])

Но когда вы делаете explain(), Монго не сообщает мне индексабыл использован в этом запросе, когда ясно, что индекс для поля времени Date мог быть. Почему это? Как я могу заставить монго использовать индекс для более оптимального запроса?

1 Ответ

0 голосов
/ 09 октября 2019

Индексы хранят указатели на фактические документы и могут использоваться только при работе с документом материала (т. Е. Документом, который фактически хранится на диске).

$match или $sort не изменяет видфактические документы и, следовательно, индексы могут использоваться на этих этапах.

Напротив, $unwind, $group или любые другие этапы, которые изменяют фактические представления документов, в основном теряют связь между индексом и материаломдокументы.

Кроме того, когда эти этапы обрабатываются без $match, вы в основном говорите, что хотите обработать всю коллекцию. Нет смысла использовать индекс, если вы хотите обработать всю коллекцию.

...