и другое поле?
Имеются данные:
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.
вам бы поле это добавить в котором уже раница храница времени и интервала
Хм. А как можно добавить поле, которое будет иметь значение NOW() - $interval. Это ж динамическое значение. На СО подсказали с решением: db.test.aggregate([ { $match: { $expr: { $lt: ["$checked_at", { $subtract: ["$$NOW", { $multiply: ["$interval", 1000] }] }] } } } ])
С производительностью будет скорее всего беда при этом решении, индексы тут скорее всего не помогут. Но в моем случаее это не проблема, данных там не очень много. И поэтому добавить отдельное поле для решения вопроса производительности — это имело бы смысл. Но как можно добавить поле, которое зависит от текущего времени?
ну я имел ввиду заведите просто рядом с полем checked_at поле checked_at_diff в которое записывайте checked_at + interval, и делайте выборку checked_at_diff < now
да, понял вас. Спасибо, хорошее решение!
Обсуждают сегодня