Попытка использовать $ cond для $ sum и $ subtract - PullRequest
1 голос
/ 30 октября 2019

Мои документы:

_id:"DwNMQtHYopXKK3rXt"
client_id:"ZrqKavXX8ieGpx5ae"
client_name:"luana"
companyId:"z3ern2Q7rdvviYCGv"
is_active:true
client_searchable_name:"luana"
status:"paid"
items:Object
id:912602
gross_amount:1000
type:"service"
description:"Pedicure com Zé (pacote)"
item_id:"bjmmPPjqKdWfwJqtC"
user_id:"gWjCskpHF2a3xHYy9"
user_id_commission:50
user_id_amount:0
use_package:true
quantity:1
item_costs:Array
discount_cost:Object
 type:"package"
 value:100
 charge_from:"company_only"
entity_id:"LLRirWu5DabkRna7X"
created_at:2019-10-29T10:35:39.493+00:00
updated_at:2019-10-29T10:36:42.983+00:00
version:"2"
created_by:"2QBRDN9MACQagSkJr"
amount:0
multiple_payment_methods:Array
closed_at:2019-10-29T10:36:52.781+00:00

Итак, я сделал $ проект:

{
  _id: 0,
  closed_at: 1,
  serviceId: "$items.item_id",
  serviceAmount: "$items.gross_amount",
  discounts:"$items.discount_cost"
}

А потом $ group

 _id: {
    month: { $month: "$closed_at" },
    serviceId: "$serviceId",
    discountType: "$discounts.type",
    discountValue: "$discounts.value"
  },
  totalServiceAmount: {
    $sum: "$serviceAmount"
  }
}

Я пытаюсь сделатьсумма значений категорий в моей БД в $, на самом деле я отфильтровал все данные, поэтому у меня есть именно то, что мне нужно, вот так;

_id:Object
"month":10
"serviceId":"MWBqhMyW8ataGxjBT"
"discountType":""courtesy"
"discountValue":100

"totalServiceAmount":5000

Итак, у меня есть 5 типов скидок на мою БД, они: Процент (скидка в процентах), вежливость (сделайте сумму обслуживания 0), пакет (сделайте сумму обслуживания 0), брутто (валовая скидка стоимости) и ноль, если нет скидки o стоимости.

так, если тип скидки:

Процент: мне нужно вычесть discountValue для totalServiceAmount (discountValue будет в процентах, как мне это вычесть, если total serviceAmount имеет значение брутто)

Вежливость и пакет: мне нужно преобразовать totalServiceAmount в значение 0.

Брутто: мне нужно вычесть discountValue для totalServiceAmount.

Null: просто разрешить totalServiceAmount.

Я пытался так, чтобысделать тест, но я действительно не знаю, правильно ли я иду по правильному пути, результат был нулевым для каждой суммы со скидкой.

{
    $project: {
    {
    amountWithDiscount: {
    $cond: {
      if: {
        $eq: ["$_id.discountType", "null"]
      },
      then: "$serviceAmount", else: {
        $cond: {
          if: {
            $eq: ["$_id.discountType", "gross"]
          },
          then: {
            $subtract: ["$serviceAmount", "$_id.discountValue"]
          },
          else: "$serviceAmount"
        }
      }
    }
  }
}

Имеет смысл?

1 Ответ

1 голос
/ 30 октября 2019

Я создаю коллекцию с результатом группировки:

01) Пример документов:

[
  {
    "_id": "5db9ca609a17899b8ba6650d",
    "month": 10,
    "serviceId": "MWBqhMyW8ataGxjBT",
    "discountType": "courtesy",
    "discountValue": 0,
    "totalServiceAmount": 5000
  },
  {
    "_id": "5db9d0859a17899b8ba66856",
    "month": 10,
    "serviceId": "MWBqhMyW8ataGxjBT",
    "discountType": "gross",
    "discountValue": 100,
    "totalServiceAmount": 5000
  },
  {
    "_id": "5db9d0ac9a17899b8ba66863",
    "month": 10,
    "serviceId": "MWBqhMyW8ataGxjBT",
    "discountType": "percentage",
    "discountValue": 10,
    "totalServiceAmount": 5000
  },
  {
    "_id": "5db9d0d89a17899b8ba6687f",
    "month": 10,
    "serviceId": "MWBqhMyW8ataGxjBT",
    "discountType": null,
    "discountValue": 10,
    "totalServiceAmount": 6000
  }
]

02) Запрос:

db.collection.aggregate([
  {
    $project: {
      discountType: "$discountType",
      amountWithDiscount: {
        $cond: {
          if: {
            $eq: [
              "$discountType",
              null
            ]
          },
          then: "$totalServiceAmount",
          else: {
            $cond: {
              if: {
                $eq: [
                  "$discountType",
                  "gross"
                ]
              },
              then: {
                $subtract: [
                  "$totalServiceAmount",
                  "$discountValue"
                ]
              },
              else: {
                $cond: {
                  if: {
                    $eq: [
                      "$discountType",
                      "percentage"
                    ]
                  },
                  then: {
                    $multiply: [
                      "$totalServiceAmount",
                      {
                        $subtract: [
                          1,
                          {
                            $divide: [
                              "$discountValue",
                              100
                            ]
                          }
                        ]
                      }
                    ]
                  },
                  else: "$totalServiceAmount"
                }
              }
            }
          }
        }
      }
    }
  }
])

Рабочий пример на https://mongoplayground.net/p/nU7vhGN-uSp.

Я не знаю, полностью ли я понимаю вашу проблему, но посмотрите, решит ли она вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...