Оптимизированный для MongoDB способ выбора временной шкалы изменения количества документов - PullRequest
0 голосов
/ 02 августа 2020

Я хочу выбрать ход изменения количества документов для каждого дня текущей недели. Коллекция пользователей (очень схематично): { _id, username (str), social (obj, default: null), createdAt (int timestamp) } Мне нужно выбрать эти данные:

// Count of the new documents per each day. Example of the data I need:
{
  all: { // Social field is null
     timeline: [Monday: 1, Tuesday: 0, Wednesday: 4, Thursday: 26, Friday: 24, Saturday: 30, Sunday: 47]
  },
  social: { // Social field is not null
     timeline: [Monday: 0, Tuesday: 0, Wednesday: 2, Thursday: 8, Friday: 5, Saturday: 16, Sunday: 9]
  }
}

Лучше будет, если это будет агрегатор. Вот мой неоптимизированный код:

    let obj = { all: { timeline: [] }, social: { timeline: [] } }

    const mondayStartTime = getMonday(new Date()).getTime();
    const weekDaysStartTime = getWeekDaysStartTime(mondayStartTime);
    
    const this_week_registered = await (
        await users_collection.find({ createdAt: { $gte: mondayStartTime } })
    ).toArray();
    
    for (let i = 0; i < weekDaysStartTime.length; i++) {
        obj.all.timeline.push(
            this_week_registered.filter((obj) =>
                obj.createdAt >= weekDaysStartTime[i] && weekDaysStartTime[i + 1]
                    ? obj.createdAt < weekDaysStartTime[i + 1]
                    : true,
            ).length,
        );
        
        obj.social.timeline.push(
            this_week_registered.filter((obj) =>
                obj.social && obj.createdAt >= weekDaysStartTime[i] && weekDaysStartTime[i + 1]
                    ? obj.createdAt < weekDaysStartTime[i + 1]
                    : true,
            ).length,
        );
    }

Мне нужно сделать это одним запросом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...