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