有没有一种方法可以在投影的$ map中使用$ Set

时间:2019-04-13 19:23:50

标签: mongodb aggregation-framework

我正在尝试更新投影地图中的值。如何更新地图中的字段?我正在尝试对chargeAmount进行计算,该费用将在循环中更新。

我在ubuntu 18.04中使用MongoDB Shell版本v4.0.6

{
    $project : {
        "initialAmount": "$chargeAmount",
        "taxedData":{ 
                 $map:
                  {
                     input: "$rateTaxLevel",
                     as: "taxIds",
                     in: { 
                                $map:
                                {
                                input: "$taxValidity",
                                as: "levels",
                                in: { 
                                    //$add: [ "$$taxIds.taxid", "$$levels.taxid" ]
                                    taxingAmount:
                                    {
                                        $cond: [ { $eq: [ "$$taxIds.taxid", "$$levels.taxid" ] }, 
                                        { $divide: [ "initialAmount",{ $add: [ 1, "$$levels.tax_validityval" ]} ]
                                            //"$$levels.tax_validityval"
                                        } ,"$$REMOVE"
                                        ]

                                    },
                                        "chargeAmount" : "$taxingAmount"
                                    }
                                }   

                          }
                  }
         }
    }

}

在项目阶段使用的数据集

{ 
    "_id" : ObjectId("5caae957beca0f79bddc46d9"), 
    "uuid" : "urn:uuid:dbc692c7-898c-42c0-ae4d-73f03ed39434:0001PAYMENT93", 
    "responseTime" : NumberLong(1552589459734), 
    "direction" : "nb", 
    "api" : "payment", 
    "apiID" : "payment_v1", 
    "applicationName" : "buddhitest", 
    "applicationId" : NumberInt(93), 
    "serviceProvider" : "buddhinipun@carbon.super", 
    "serviceProviderId" : "buddhinipun@carbon.super", 
    "operatorName" : "OPERATOR1", 
    "operatorId" : NumberInt(1), 
    "operation" : "Charge", 
    "operatorRef" : "ABC-11111113589301", 
    "chargeAmount" : NumberInt(100), 
    "category" : "111", 
    "subcategory" : "222", 
    "merchant" : "111", 
    "responseCount" : "1", 
    "rateCard" : "common_percentage", 
    "price" : -9.1, 
    "year" : NumberInt(2019), 
    "month" : NumberInt(3), 
    "day" : NumberInt(14), 
    "hour" : NumberInt(19), 
    "status" : NumberInt(0), 
    "statusInfo" : "ok", 
    "userType" : " Postpaid", 
    "subRateNB" : [
        {
            "_id" : ObjectId("5cac45a037c54a0f4ce2b717"), 
            "sub_rate_nbid" : NumberInt(17), 
            "api_operationid" : NumberInt(1), 
            "api_version" : "v1", 
            "applicationid" : NumberInt(93), 
            "rate_defid" : NumberInt(30), 
            "sub_rate_nbactdate" : null, 
            "sub_rate_nbdisdate" : null, 
            "createdby" : null, 
            "createddate" : ISODate("2019-01-16T18:31:18.000+0000"), 
            "updatedby" : null, 
            "updateddate" : ISODate("2019-01-16T18:31:18.000+0000")
        }
    ], 
    "rateTaxLevel" : [
        {
            "_id" : ObjectId("5cac45c437c54a0f4ce2b7a7"), 
            "rate_taxesid" : NumberInt(177), 
            "rate_defid" : NumberInt(30), 
            "taxid" : NumberInt(40), 
            "level" : NumberInt(1)
        }, 
        {
            "_id" : ObjectId("5cac45c437c54a0f4ce2b7a8"), 
            "rate_taxesid" : NumberInt(178), 
            "rate_defid" : NumberInt(30), 
            "taxid" : NumberInt(41), 
            "level" : NumberInt(2)
        }, 
        {
            "_id" : ObjectId("5cac45c437c54a0f4ce2b7a9"), 
            "rate_taxesid" : NumberInt(179), 
            "rate_defid" : NumberInt(30), 
            "taxid" : NumberInt(1), 
            "level" : NumberInt(3)
        }, 
        {
            "_id" : ObjectId("5cac45c437c54a0f4ce2b7aa"), 
            "rate_taxesid" : NumberInt(180), 
            "rate_defid" : NumberInt(30), 
            "taxid" : NumberInt(66), 
            "level" : NumberInt(4)
        }, 
        {
            "_id" : ObjectId("5cac45c437c54a0f4ce2b7ab"), 
            "rate_taxesid" : NumberInt(181), 
            "rate_defid" : NumberInt(30), 
            "taxid" : NumberInt(68), 
            "level" : NumberInt(5)
        }
    ], 
    "taxValidity" : [
        {
            "_id" : ObjectId("5cac469137c54a0f4ce2b7be"), 
            "idtax_validityid" : NumberInt(1), 
            "tax_validityactdate" : ISODate("2018-10-09T18:30:00.000+0000"), 
            "tax_validitydisdate" : ISODate("2020-10-09T18:30:00.000+0000"), 
            "tax_validityval" : 0.02, 
            "taxid" : NumberInt(1), 
            "createdby" : null, 
            "createddate" : ISODate("2018-10-26T13:05:58.000+0000"), 
            "updatedby" : null, 
            "updateddate" : ISODate("2018-10-26T13:05:58.000+0000")
        }, 
        {
            "_id" : ObjectId("5cac469137c54a0f4ce2b7d5"), 
            "idtax_validityid" : NumberInt(27), 
            "tax_validityactdate" : ISODate("2018-10-29T18:30:00.000+0000"), 
            "tax_validitydisdate" : ISODate("2035-11-10T18:30:00.000+0000"), 
            "tax_validityval" : 0.5, 
            "taxid" : NumberInt(40), 
            "createdby" : null, 
            "createddate" : ISODate("2018-10-30T17:31:40.000+0000"), 
            "updatedby" : null, 
            "updateddate" : ISODate("2018-10-30T17:31:40.000+0000")
        }, 
        {
            "_id" : ObjectId("5cac469137c54a0f4ce2b7d6"), 
            "idtax_validityid" : NumberInt(28), 
            "tax_validityactdate" : ISODate("2018-10-31T18:30:00.000+0000"), 
            "tax_validitydisdate" : ISODate("2018-11-07T18:30:00.000+0000"), 
            "tax_validityval" : 2.0, 
            "taxid" : NumberInt(41), 
            "createdby" : null, 
            "createddate" : ISODate("2018-10-30T17:42:20.000+0000"), 
            "updatedby" : null, 
            "updateddate" : ISODate("2018-10-30T17:42:20.000+0000")
        }, 
        {
            "_id" : ObjectId("5cac469137c54a0f4ce2b7ec"), 
            "idtax_validityid" : NumberInt(50), 
            "tax_validityactdate" : ISODate("2018-11-11T18:30:00.000+0000"), 
            "tax_validitydisdate" : ISODate("2018-11-30T18:30:00.000+0000"), 
            "tax_validityval" : 0.23, 
            "taxid" : NumberInt(66), 
            "createdby" : null, 
            "createddate" : ISODate("2018-11-12T20:22:47.000+0000"), 
            "updatedby" : null, 
            "updateddate" : ISODate("2018-11-12T20:22:47.000+0000")
        }, 
        {
            "_id" : ObjectId("5cac469137c54a0f4ce2b7ee"), 
            "idtax_validityid" : NumberInt(52), 
            "tax_validityactdate" : ISODate("2018-11-30T18:30:00.000+0000"), 
            "tax_validitydisdate" : ISODate("2018-12-07T18:30:00.000+0000"), 
            "tax_validityval" : 0.01, 
            "taxid" : NumberInt(68), 
            "createdby" : null, 
            "createddate" : ISODate("2018-11-26T15:02:51.000+0000"), 
            "updatedby" : null, 
            "updateddate" : ISODate("2018-11-26T15:02:51.000+0000")
        }
    ]
}
// ----------------------------------------------
{ 
    "_id" : ObjectId("5caae957beca0f79bddc46da"), 
    "uuid" : "urn:uuid:a566d97b-8032-47d2-aef3-ad5807af3742:0001PAYMENT93", 
    "responseTime" : NumberLong(1552895806695), 
    "direction" : "nb", 
    "api" : "payment", 
    "apiID" : "payment_v1", 
    "applicationName" : "buddhitest", 
    "applicationId" : NumberInt(93), 
    "serviceProvider" : "buddhinipun@carbon.super", 
    "serviceProviderId" : "buddhinipun@carbon.super", 
    "operatorName" : "OPERATOR1", 
    "operatorId" : NumberInt(1), 
    "operation" : "Charge", 
    "operatorRef" : "ABC-123", 
    "chargeAmount" : NumberInt(10), 
    "category" : "", 
    "subcategory" : "", 
    "merchant" : "", 
    "responseCount" : "1", 
    "rateCard" : "common_percentage", 
    "price" : -0.91, 
    "year" : NumberInt(2019), 
    "month" : NumberInt(3), 
    "day" : NumberInt(18), 
    "hour" : NumberInt(8), 
    "status" : NumberInt(0), 
    "statusInfo" : "ok", 
    "userType" : " Postpaid", 
    "subRateNB" : [
        {
            "_id" : ObjectId("5cac45a037c54a0f4ce2b717"), 
            "sub_rate_nbid" : NumberInt(17), 
            "api_operationid" : NumberInt(1), 
            "api_version" : "v1", 
            "applicationid" : NumberInt(93), 
            "rate_defid" : NumberInt(30), 
            "sub_rate_nbactdate" : null, 
            "sub_rate_nbdisdate" : null, 
            "createdby" : null, 
            "createddate" : ISODate("2019-01-16T18:31:18.000+0000"), 
            "updatedby" : null, 
            "updateddate" : ISODate("2019-01-16T18:31:18.000+0000")
        }
    ], 
    "rateTaxLevel" : [
        {
            "_id" : ObjectId("5cac45c437c54a0f4ce2b7a7"), 
            "rate_taxesid" : NumberInt(177), 
            "rate_defid" : NumberInt(30), 
            "taxid" : NumberInt(40), 
            "level" : NumberInt(1)
        }, 
        {
            "_id" : ObjectId("5cac45c437c54a0f4ce2b7a8"), 
            "rate_taxesid" : NumberInt(178), 
            "rate_defid" : NumberInt(30), 
            "taxid" : NumberInt(41), 
            "level" : NumberInt(2)
        }, 
        {
            "_id" : ObjectId("5cac45c437c54a0f4ce2b7a9"), 
            "rate_taxesid" : NumberInt(179), 
            "rate_defid" : NumberInt(30), 
            "taxid" : NumberInt(1), 
            "level" : NumberInt(3)
        }, 
        {
            "_id" : ObjectId("5cac45c437c54a0f4ce2b7aa"), 
            "rate_taxesid" : NumberInt(180), 
            "rate_defid" : NumberInt(30), 
            "taxid" : NumberInt(66), 
            "level" : NumberInt(4)
        }, 
        {
            "_id" : ObjectId("5cac45c437c54a0f4ce2b7ab"), 
            "rate_taxesid" : NumberInt(181), 
            "rate_defid" : NumberInt(30), 
            "taxid" : NumberInt(68), 
            "level" : NumberInt(5)
        }
    ], 
    "taxValidity" : [
        {
            "_id" : ObjectId("5cac469137c54a0f4ce2b7be"), 
            "idtax_validityid" : NumberInt(1), 
            "tax_validityactdate" : ISODate("2018-10-09T18:30:00.000+0000"), 
            "tax_validitydisdate" : ISODate("2020-10-09T18:30:00.000+0000"), 
            "tax_validityval" : 0.02, 
            "taxid" : NumberInt(1), 
            "createdby" : null, 
            "createddate" : ISODate("2018-10-26T13:05:58.000+0000"), 
            "updatedby" : null, 
            "updateddate" : ISODate("2018-10-26T13:05:58.000+0000")
        }, 
        {
            "_id" : ObjectId("5cac469137c54a0f4ce2b7d5"), 
            "idtax_validityid" : NumberInt(27), 
            "tax_validityactdate" : ISODate("2018-10-29T18:30:00.000+0000"), 
            "tax_validitydisdate" : ISODate("2035-11-10T18:30:00.000+0000"), 
            "tax_validityval" : 0.5, 
            "taxid" : NumberInt(40), 
            "createdby" : null, 
            "createddate" : ISODate("2018-10-30T17:31:40.000+0000"), 
            "updatedby" : null, 
            "updateddate" : ISODate("2018-10-30T17:31:40.000+0000")
        }, 
        {
            "_id" : ObjectId("5cac469137c54a0f4ce2b7d6"), 
            "idtax_validityid" : NumberInt(28), 
            "tax_validityactdate" : ISODate("2018-10-31T18:30:00.000+0000"), 
            "tax_validitydisdate" : ISODate("2018-11-07T18:30:00.000+0000"), 
            "tax_validityval" : 2.0, 
            "taxid" : NumberInt(41), 
            "createdby" : null, 
            "createddate" : ISODate("2018-10-30T17:42:20.000+0000"), 
            "updatedby" : null, 
            "updateddate" : ISODate("2018-10-30T17:42:20.000+0000")
        }, 
        {
            "_id" : ObjectId("5cac469137c54a0f4ce2b7ec"), 
            "idtax_validityid" : NumberInt(50), 
            "tax_validityactdate" : ISODate("2018-11-11T18:30:00.000+0000"), 
            "tax_validitydisdate" : ISODate("2018-11-30T18:30:00.000+0000"), 
            "tax_validityval" : 0.23, 
            "taxid" : NumberInt(66), 
            "createdby" : null, 
            "createddate" : ISODate("2018-11-12T20:22:47.000+0000"), 
            "updatedby" : null, 
            "updateddate" : ISODate("2018-11-12T20:22:47.000+0000")
        }, 
        {
            "_id" : ObjectId("5cac469137c54a0f4ce2b7ee"), 
            "idtax_validityid" : NumberInt(52), 
            "tax_validityactdate" : ISODate("2018-11-30T18:30:00.000+0000"), 
            "tax_validitydisdate" : ISODate("2018-12-07T18:30:00.000+0000"), 
            "tax_validityval" : 0.01, 
            "taxid" : NumberInt(68), 
            "createdby" : null, 
            "createddate" : ISODate("2018-11-26T15:02:51.000+0000"), 
            "updatedby" : null, 
            "updateddate" : ISODate("2018-11-26T15:02:51.000+0000")
        }
    ]
}
// ----------------------------------------------

我使用Java脚本功能获得了此结果

"------------------------------------"
"l1Tax% : 1.02"
"l1Tax : 98.0392156862745"
"l2Tax% : 1.5"
"l2Tax : 65.359477124183"
"l3Tax% : 3"
"l3Tax : 21.78649237472767"
"l4Tax% : 1.23"
"l4Tax : 17.712595426607862"
"l5Tax% : 1.01"
"l5Tax : 17.537223194661248"
"------------------------------------"
"l1Tax% : 1.02"
"l1Tax : 9.803921568627452"
"l2Tax% : 1.5"
"l2Tax : 6.535947712418301"
"l3Tax% : 3"
"l3Tax : 2.1786492374727673"
"l4Tax% : 1.23"
"l4Tax : 1.7712595426607864"
"l5Tax% : 1.01"
"l5Tax : 1.7537223194661251"

使用下面的Java脚本函数,我能够获得所需的输出,但是Java脚本方法的性能显着下降。

forEach(function (doc) {
    var taxableamount = doc.chargeAmount;
    var taxedAmmount =0;
    printjson("------------------------------------");
    for (index = 0; index < doc.rateTaxLevel.length; index++) { 
         for (index = 0; index < doc.taxValidity.length; index++) { 

              taxedAmmount = taxableamount / (1+doc.taxValidity[index].tax_validityval);
              taxableamount = taxedAmmount;
              printjson("l"+doc.rateTaxLevel[index].level+"Tax% : "+(1+doc.taxValidity[index].tax_validityval));
              printjson("l"+doc.rateTaxLevel[index].level+"Tax : "+taxableamount);
        } 
    }

}

0 个答案:

没有答案