MongoDB создает индекс на дату с определенной степенью детализации?

#mongodb #mongodb-query

#mongodb #mongodb-запрос

Вопрос:

Например, у меня есть коллекция с этой схемой:

 {
  timestamp: new Date(some-arbitrary-specific-datetime),
  some-other-field: any-type.
}
 

И обычным запросом является фильтрация и получение документов с диапазоном временных меток:

 collection.find({
  timestamp: {$lte: someDate, $gte: someLaterDate}
})
 

Производительность важна, потому что эта коллекция большая, и запрос может вернуть более 100 тыс. документов.

В моем запросе меня интересует только степень детализации до уровня дня.

Интересно, возможно ли создать индекс в коллекции на основе timestamp дня, а не точной даты и времени?

Я знаю, что это можно сделать в коде приложения, добавив новое поле в коллекцию и создав дату с детализацией до уровня дня и запросив ее таким же образом, т.е.:

 {
  timestamp: new Date(1476479514),
  date: new Date("2016-10-14"),
  some-other-field: any-type
}
 

и запрос:

 collection.find({
  date: {$lte: new Date("2016-10-14"), $gte: new Date("2016-10-12")}
})
 

и создать индекс:

 collection.collectionName.createIndex({date: 1});
 

но сейчас это невозможно сделать в коде приложения. Могу ли я создать аналогичный индекс, используя только timestamp поле?

Ответ №1:

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

Дата BSON — это 64-разрядное целое число, представляющее количество миллисекунд, прошедших с эпохи Unix (1 января 1970 года).

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

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