基于多个条件进行聚合

时间:2019-06-11 08:37:33

标签: mongodb aggregate aggregation

我正在设置一个仪表板,我们希望在其中显示每个月的一些KPI。我有一家公司的业务集合,每个公司可以有一个订阅,该订阅可以容纳多个订阅(数组),目标是获取每个月的订阅总数。

这是我的查询,用于获取在current month结束之前创建的所有订阅,以了解每月的增长情况。

const queryForAmountOfSub = [
          { $project: { 'subscription.subscriptions': 1 } },
          { $unwind: '$subscription.subscriptions' },
          {
            $project: {
              'subscription.subscriptions': 1,
              isActive: {
                $cond: [
                  {
                    $and: [
                      { $lte: ['$subscription.subscriptions.startedAt', lastDayOfMonth.toDate()] },
                      {
                        $or: [
                          { $ne: ['$subscription.subscriptions.endedAt', null] },
                          { $gt: ['$subscription.subscriptions.endedAt', lastDayOfMonth.toDate()] },
                        ],
                      },
                    ],
                  },
                  true,
                  false,
                ],
              },
            },
          },

          { $match: { isActive: true } },
          { $count: 'total' },
        ];

以下是每个订阅数据如何存储的示例。

 "subscriptions" : [
            {
                "handle" : "sub-xxx", 
                "plan" : "plus-monthly", 
                "status" : NumberInt(1), 
                "startedAt" : ISODate("2019-06-07T12:42:29.927+0000"), 
                "freeMonths" : NumberInt(0), 
                "paidAt" : ISODate("2019-06-07T12:42:29.927+0000"),
                "endedAt" : ISODate("2019-08-07T12:42:29.927+0000"),
            }
        ]

StartedAt是订阅的开始日期,paidAtstartedAt + freeMonths(如果有)。 EndedAt是他们终止订阅的日期,只有在订阅结束时才在那里。

问题是第二个$project及其内部的条件无法正常工作。有人可以看到我在这里想念的吗?

我的预期结果是获取所有在当月最后一天之前开始的订阅,并且结束不存在或大于当月最后一天的订阅。

谢谢!

0 个答案:

没有答案