Мангуст: $ сумма, если условия - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть запрос с поиском и агрегат , который находит в модели Schedule, и вычисляет сумму общего количества услуг и общую стоимость услуг.Но мне нужно сделать эту сумму (сумму totalServices) с условием, где «статус» равен 2. Могу ли я сделать это?

Мой запрос:

 Schedule.find(findTerm)
    .skip(req.body.page * req.body.limit)
    .limit(Number(req.body.limit))
    .select(
      "service.name value scheduleStart scheduleEnd comissionValue status paymentMethod"
    )
    .exec((err, response) => {
      if (err) res.status(500).send(err);

      Schedule.find(findTerm)
        .count()
        .exec((error, count) => {
          if (error)
            res.status(500).send({
              error,
              code: 0,
              message: "Erro."
            });

          Schedule.aggregate([{
              $match: {              
                store: req.body.store,             
              }
            },
            {
              $group: {
                _id: {
                  id: "$store"
                },
                totalValue: {
                  $sum: "$value"
                },
                totalServices: {
                  $sum:  {
                    $cond: [ {
                      $eq: [ "$status", 2 ]
                    }]
                  }
                },
                count: {
                  $sum: 1
                }
              }
            }...

Результат моего запроса:

...{
            "service": {
                "name": "CABELO + BARBA"
            },
            "comissionValue": 0,
            "paymentMethod": 0,
            "_id": "5bfec336c6f00d2e88f8d765",
            "scheduleStart": "2018-11-28 14:35",
            "scheduleEnd": "2018-11-28 15:45",
            "status": 2,
            "value": 75
        },
        {
            "service": {
                "name": "Barba"
            },
            "comissionValue": 0,
            "paymentMethod": 0,
            "_id": "5bfec3ffc6f00d2e88f8d766",
            "scheduleStart": "2018-11-28 18:30",
            "scheduleEnd": "2018-11-28 18:50",
            "status": 2,
            "value": 20
        }
    ],
    "count": 4299,
    "group": [
        {
            "_id": {
                "id": "5b16cceb56a44e2f6cd0324b"
            },
            "totalValue": 777780048281, //right value
            "totalServices": 945, //wrong value
            "count": 676
        }
    ]
}

Мне нужно отфильтровать сумму totalServices только для объектов, если status равно 2 (я пытался использовать$ cond но не сработало).

1 Ответ

0 голосов
/ 28 ноября 2018

Вам необходимо проверить status условно ($cond), т. Е. Если status равно ($eq) до 2, затем $sum поле value, остальное передается 0

Schedule.aggregate([
  { "$match": { "store": req.body.store }},
  { "$group": {
    "_id": { "id": "$store" },
    "totalValue": { "$sum": "$value" },
    "totalServices": {
      "$sum": { "$cond": [{ "$eq": ["$status", 2] }, 1, 0] }
    },
    "count": { "$sum": 1 }
  }}
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...