Получить общее количество размеров отфильтрованного поля

#mongodb #mongoose

#mongodb #мангуст

Вопрос:

 user_number: {
    $add: [
        $size: {
            '$schedules.users': {
                $filter: {
                    input: '$schedules',
                    as: 'schedule',
                    cond: {
                            $and: [
                                    {
                                    $gte: ['$schedule.schedule_info.schedule_time', start_date]
                                    },
                                    { $lte: ['$schedule.schedule_info.schedule_time', end_date] }
                                ]
                            }
                        }
                    }
                },
            ]
        }
 

Я хочу вернуть общее количество пользователей, которые посещают расписание, в котором фильтруются события. schedules.users Поле каждого документа представляет собой массив, содержащий user names . Как я могу получить общее количество пользователей, которые являются частью отфильтрованных расписаний?

Я могу получить общее количество, используя $add и общее количество пользователей, посещающих расписание $size . Тем не менее, я застрял на их объединении с $filter .

Редактировать:

  {
      schedules: [
         {
         name: 'gaming events',
         date: '2021-01-14 07:00:00.000Z'
         attendee: [
            'john',
            'jane',
            'joe',
            'dow',
        ],
      },
      {
         name: 'GTA events',
         date: '2021-01-15 07:00:00.000Z'
         attendee: [
            'john',
            'Tina',
            'joe',
        ],
      },
      {
         name: 'gaming events',
         date: '2021-01-19 07:00:00.000Z'
         attendee: [
            'john',
            'jane',
            'joe',
            'dow',
        ],
      },
     ],
      calcDistance: 1643.3598155320283,
    },
 
  • Расписание фильтрации с заданной датой.
  • Возвращает общее количество посетителей из отфильтрованных расписаний.

Если я отфильтровал расписания с «2021-01-14 по 2021-01-15», то это будет 4 3 = 7.

Ответ №1:

  • $filter расписание на основе вашего условия даты на первом этапе
  • $reduce чтобы повторить цикл schedules.attendee и получить общее количество и размер attendee используемых $add и $size
 db.collection.aggregate([
  {
    $addFields: {
      schedules: {
        $filter: {
          input: "$schedules",
          cond: {
            $and: [
              { $gte: ["$this.date", start_date] },
              { $lte: ["$this.date", end_date] }
            ]
          }
        }
      }
    }
  },
  {
    $addFields: {
      totalAttendees: {
        $reduce: {
          input: "$schedules.attendee",
          initialValue: 0,
          in: { $add: [{ $size: "$this" }, "$value"] }
        }
      }
    }
  }
])
 

Игровая площадка