如何将 amount*(1+percent)/10 转换为 mongoDB 聚合?

how to turn amount*(1+percent)/10 into a mongoDB aggregation?

总的来说,我已经达到了这一点:

amount: { $sum: { $multiply: ["$amount", {$add: ["$percent", 1]}]  }  }  } }]);

当我想使用 $divide 时,它给了我 unknown group operator '$divide'" 的错误。如何将其除以 10?

编辑:

db.junk.aggregate([{  $project: {  _id: 0,  cart_closed: 1,  amount: 1,  
percent: 1, shop_id: 1  } }, {  $group: {  
_id: {  cart_closed: {  month: {  $month: "$cart_closed"  },  year: {   
$year: "$cart_closed"  }  }, shop_id: "$shop_id"  },  amount: { $sum: {   
$multiply: ["$amount", {$add: ["$percent", 1]}]  }  }  } }]);  

其实我不group by使用那个算术表达式。

如果您遇到错误,那么您在错误的地方调用了该方法。 $group 下的任何内容都必须是分组 _id 或累加器函数,例如 $sum:

假设您有这样的文件:

{ "amount": 100, "percent": 10 },
{ "amount": 20, "percent": 33 }

然后你就这样做:

db.junk.aggregate([
    { "$group": {
        "_id": null,
        "amount": { "$sum": {
            "$multiply": [
                "$amount",
                { "$divide": [ "$percent", 100 ] },
            ]
        }}
    }}
])

或者像这样的文档:

{ "amount": 100, "percent": .10 },
{ "amount": 20, "percent": .33 }

那就简单了$multiply:

db.junk.aggregate([
    { "$group": {
        "_id": null,
        "amount": { "$sum": {
            "$multiply": [
                "$amount",
                "$percent"
            ]
        }}
    }}
])

两者都给出了预期的结果:

{ "_id" : null, "amount" : 16.6 }

否则,如果字段不存在,则只需填写您想要的常量值。

只需调用累加器中的所有内容即可。如果你想"divide after"求和,那么你$project$group阶段之后。

db.junk.aggregate([
    { "$group": {
        "_id": null,
        "amount": { "$sum": "$amount" }
    }},
    { "$project": {
        "amount": { "$multiply": [ "$amount", .70 ] }
    }}
])

如果您根本不分组,那么只需在字段中使用数学即可:

db.junk.aggregate([
    { "$project": {
        "amount": {
            "$multiply": [
                "$amount",
                "$percent"
            ]
        }
    }}
])

在这样存储的地方打折 5%:

{ "amount": 100, "percent": .05 }

然后你做:

db.junk.aggregate([
    { "$project": {
        "amount": {
            "$multiply": [
                "$amount",
                { "$subtract": [ 1, "$percent" ] }
            ]
        }
    }}
])

哪个returns:

{ "_id" : ObjectId("55bc9d29408c74e7d57c0176"), "amount" : 95 }

比原金额低 5% ( 5 )。

您的公式 returns 不同的结果。将操作命令到 BODMAS:

db.junk.aggregate([
    { "$project": {
        "amount": {
            "$divide": [
                { "$multiply": [
                    "$amount",
                    { "$add": [ 1, "$percent" ] }
                ]},
                10
            ]
        }
    }}
])

即:

{ "_id" : ObjectId("55bc9d29408c74e7d57c0176"), "amount" : 10.5 }