首页 > 解决方案 > 获取过滤字段大小的总数

问题描述

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. 如何获取属于过滤计划的用户总数?

我可以通过 using$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。

标签: mongodbmongoose

解决方案


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

操场


推荐阅读