Агрегат на основе нескольких условий MongoDB - PullRequest
0 голосов
/ 11 июня 2019

Я настраиваю панель управления, где мы хотим показывать некоторые 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 - это дата начала подписки, paidAt - это startedAt + freeMonths, если таковая имеется.EndedAt - это дата, когда они завершили подписку, и только там, если подписка была закончена.

Проблема заключается во втором $project и состоянии внутри него, которое на самом деле не работает правильно.Кто-нибудь может увидеть, что мне здесь не хватает?

Мой ожидаемый результат - получить все подписки, которые были начаты до последнего дня текущего месяца, и где окончание либо не существует, либо превышает последний день текущего месяца.

Спасибо!

...