#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"] }
}
}
}
}
])