尝试将$ cond用作$ sum和$ subtract

时间:2019-10-30 17:19:23

标签: mongodb mongodb-query

我的文档:

_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

所以我做了一个$ project:

{
  _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值,则为null。

因此,如果折扣类型为;

百分比:我需要减去totalServiceAmount的discountValue(折扣值将以百分比表示,如果总serviceAmount以总价值计,我该如何减去)

礼貌和打包:我需要将totalServiceAmount转换为0值。

总价:我需要减去totalServiceAmount的DiscountValue。

空:只让totalServiceAmount。

我试图那样做一些测试,但是我真的不知道自己是否正确,对每一个amountWithDiscount结果都是空的。

{
    $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 个答案:

答案 0 :(得分:1)

我用您的分组结果创建一个集合:

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上的工作示例。

我不知道我是否完全了解您的问题,但是 看看它是否能解决您的问题。