можно аггрегировать данные по определенным временным интервалам, к-ые начинаются с сего дня ?
условно, есть 4 вида группировки
- неделя
- месяц
- год
- все время
везде группировка не по календарному дню / месяцу / году, а начиная с текущего дня (включительно). и вот стоит задача разбить данные в каждом типе группировки на равные интервалы
для недели — по дню (7 дней от текущего)
для месяца — по неделе (4 недели с текущего дня)
для года — по месяцу (12 месяцев с текущего дня)
для N лет — по году с текущего дня
данные вида
{id, date, ...otherFields}
вопрос заключается в том, как в aggregation пайплайне нарезать данные на такие вот кастомные слайсы, саму агрегацию я как-нить сам докручу. спасибо всем, кто откликнется )
используйте сорт по дате
либо 2 вариант обычный find с $gte
вопрос не в поиске данных в диапазоне, а группировке данных внутри диапазона по неделе / месяцу / году-ам от текущей даты юзера. кажется, вариант с оффсетом должен помочь, попробую проверить, как дойду до компа
Есть операторы, $lt,$lte,$gt,$gte. Используй их для поиска промежтоков между датами
вот как раз ваши "для .." и делаются обычным find + gte, lte
кажется, я плохо сформулировал задачу ) есть сиквенс данных формата [{id, date, ...}, {id, date, ...}, {id, date, ...}] нужно 1) фильтрануть данные по нужному мне интервалу (это очевидно, как сделать, как раз через find + lte / gte) 2) по отфильтрованным данным сделать группировку и агрегацию по промежуткам. условно, groupBy isoWeek, но мне нужен не isoWeek / month/ etc, а текущая дата юзера. т.е. isoWeek нарежет мне данные за месяц на 4 недели календарные, с понедельника по воскресенье. мне же нужно нарезать с текущего дня + 7 дней назад. например, сегодня среда, значит мне нужно нарезать данные начиная со среды - 7 дней, потом среды - 14, среды - 21 и тд
сложно понять ваше "групировка", мне кажется это не то, что имеется ввиду. группировка, это - показать сколько раз встерачется id и тд. Ваша ж формулировка - чисто "разбитие" по рейнджу дат - не вижу самой группировки - по чем она должна быть или вам она вовсе и ненужна?
мне дальше нужно будет агрегировать вот эти нарезанные слайсы и показывать сумму / avg значений из этого слайса т.е. если я выбираю - недельный слайс, то нужно показать агрегацию значений за 7 дней начиная с текущего (на графике должно быть 7 баров) - месячный слайс, то нужно показывать агрегацию значений за неделю, начиная с текущего дня (на графике должно быть 4 бара) - годовой - значение за месяц (у нас усредненно 28 дней) начиная с текущего дня, на графике 12 баров
Вы хотите это всё за один запрос получить?
вот тут совсем другой разговор) Гляньте примеры: https://www.mongodb.com/docs/manual/reference/operator/aggregation/sum/
лучше как 4 отдельных запроса пускать
я бы вывод обрабатывал в приложении, а не пытался делать оверхард через СУБД, которая не для этого предназначена
групировка - это обычная задача бд, какой оверхед?
группировка - это поиск по заданному условию, а не обработка и форматирование выводного результата
задайте себе вопрос: зачем вытаскивть всю бд, грузить ее на бек, чтобы сделать групировку, которая просто вернет avg. Когда тоже самое может сделать бд, быстрее и получить сразу готовый результат
какую всю бд? я написал такое? где? сделать 4 операции внутри с возможностью упереться в bson, о котором выше написали идея для слабой реализации с критическими точками и низкой отказоустойчивостью а вот вывести 4 нужных участка и разложить как нужно, переформатировать, это другое
ну так прочтите еще раз, что написали.
Обсуждают сегодня