@vetalmatitskiy
testing engineer

Как из mongoDB получить все значения в некотором временном интервале?

Делаю систему, которая получает с сервера данные и сохраняет их в MongoDB. Сервер в json-ответе отдает UNIX-время и значение интересующей величины. мне нужно сохранить само значение и время. Дальше мне нужно чтобы пользователь указав начальное и конечное время получил все значения которые лежат в заданном интервале времени. Подскажите, пожалуйста, как оптимально организовать хранение данных в MongoDB, чтобы потом одним запросом можно было получить все значения за интервал времени
  • Вопрос задан
  • 618 просмотров
Пригласить эксперта
Ответы на вопрос 2
zoonman
@zoonman
⋆⋆⋆⋆⋆
Вобщем есть 2 в целом равнозначных способа получения результатов.
Первый - сохранять Unixtime как NumberLong() и работать с операторами сравнения. NumberLong хранится как 64-битное целое число.
Второй - использовать тип Date() и переводить Unixtime в него. Операторы сравнения также будут работать с ним.
Оба варианта в принципе одинаковы, т.к. объект будет сконвертирован в то же 64-битное целое.

Разница будет на уровне общения с базой, в первом случае вам прийдется превращать все даты в число и передавать это число базе, во втором вы будете передавать объект Date().

Я бы рекомендовал применить Date(), и, если у вас не планируется значений в одно и тоже время, сохранять его внутри поля _id. Таким образом вы можете сэкономить индекс.
Ответ написан
Комментировать
@violentov
Можно и так:
1) В Schema:
...
date: {
type: String,
},
...
2) При сохранении записываем туда миллисекунды (результат Date.prototype.getTime())
3) Пример запроса:
db.collection.find({$and:[{date:{$gte:'1471974357000'}}, {date:{$lt:'1471974537000'}}]}).pretty()
4) Если использовать, например, mongoose, это выглядит как-то так:
findQuery.$and.push({
date: { $gte: `${new Date(year, month, day, hour).getTime()}` },
}) и т.д.

Upd: Чтобы конвертировать unixtime в формат Date.prototype.getTime, нужно просто его умножить на 1000
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы