Подскажите, можно ли в монге в запросе использовать текущую дату

и другое поле?

Имеются данные:
db.test.insertMany([
{ name: "n1", interval: 10, checked_at: new ISODate("2019-10-10 12:12:12") },
{ name: "n2", interval: 20, checked_at: new ISODate("2020-10-10 12:12:12") },
{ name: "n3", interval: 30, checked_at: new ISODate("2020-10-10 12:12:12") }])
Требуется найти все документы, у которых checked_at старше, чем текущая дата минус кол-во секунд, которое в поле interval.

Схематично запрос выглядит так:
db.test.find({"checked_at": {"$lt": "$NOW - $interval(seconds)"}})

Обычно всегда когда работал с датами, саму дату я генерил на уровне приложения. А тут я это сделать не могу, так как надо отнять кол-во секунд, которое для каждого документа уникальна и лежит в поле $interval.

5 ответов

27 просмотров

вам бы поле это добавить в котором уже раница храница времени и интервала

Max-Block Автор вопроса
Ilya Flakin
вам бы поле это добавить в котором уже раница хран...

Хм. А как можно добавить поле, которое будет иметь значение NOW() - $interval. Это ж динамическое значение. На СО подсказали с решением: db.test.aggregate([ { $match: { $expr: { $lt: ["$checked_at", { $subtract: ["$$NOW", { $multiply: ["$interval", 1000] }] }] } } } ])

Max-Block Автор вопроса
Ilya Flakin
вам бы поле это добавить в котором уже раница хран...

С производительностью будет скорее всего беда при этом решении, индексы тут скорее всего не помогут. Но в моем случаее это не проблема, данных там не очень много. И поэтому добавить отдельное поле для решения вопроса производительности — это имело бы смысл. Но как можно добавить поле, которое зависит от текущего времени?

ну я имел ввиду заведите просто рядом с полем checked_at поле checked_at_diff в которое записывайте checked_at + interval, и делайте выборку checked_at_diff < now

Max-Block Автор вопроса
Ilya Flakin
ну я имел ввиду заведите просто рядом с полем chec...

да, понял вас. Спасибо, хорошее решение!

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

Обсуждают сегодня

Добрый вечер, Пока не совсем понимаю как наладить общение между телеграм ботом и ПО для работы с сим боксом. По самому боту так понял: - Нужен некий баланс, который можно поп...
Magic
6
сделал сайт, прикрутил в боте сайт, и виджет логина. как автоматически логинить пользователя в аккаунт(телеграм), при входе с бота?
Александра Чернивецкая
5
Объясните, пожалуйста, почему компилятор ругается на использование в условии неинициализированной переменной: int x; Task.Run(async () => { x = await somefunc(); }).Wait...
Александр
5
Ребят, подскажите, пожалуйста, почему в префиксе к ассетам, которые генерируются через фильтр | theme в шаблоне, стал вдруг появляться index.php? Вот так выглядит ссылка на а...
Виталий
1
Всем привет. Ребята, подскажите, пожалуйста. у ботов есть ограничение на отправку сообщений - 30 сообщений в секунду, эти ограничения накладываются на все сообщения? или на со...
Artem Stormageddon
4
1. https://www.kaggle.com/code/ahmadrezagholami2001/housing-estimation-linear-regression 2. https://www.kaggle.com/code/ahmadrezagholami2001/uncovering-quality-in-wines-logis...
Ahmadreza
1
Блин, ребята, сори за тупые вопросы. А можно ли как-то открыть вебапку по нажатию на кнопку в меню(которое появляется слева, команды)?
Artem Stormageddon
3
а плаксы из-под питона умеют только в комфортных условиях что-то выдавить из себя?)
Lencore
9
Но, может, есть уже проверенная? Наши требования такие: 1. Сообщения должны приходить из Инста в CRM оду 2. Должна быть возможность подключить несколько экаунтов Инстаграм. Р...
Alexander Sharoiko MSE / Александр Шаройко
13
Это может быть все-таки не флудвейт? у меня ботфазер принимает изменения и отображает даже что они изменились, на видео видно что он прислал якобы уже измененное описание, н...
OVERLINK
13
Карта сайта