如何将金额*(1 +%)/ 10转换为mongoDB聚合?

时间:2015-08-01 09:49:30

标签: mongodb mongodb-query aggregation-framework

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

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使用该算术表达式。

1 个答案:

答案 0 :(得分:1)

如果您收到错误,那么您在错误的地方调用该方法。 $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 }

如果字段不存在则另外,则只需填写所需的常量值。

只需要在累加器中调用所有内容。如果你想"除以"总和,然后是$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" ] }
            ]
        }
    }}
])

返回:

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

比原始数量低5%(<5)。

您的公式会返回不同的结果。将操作订购到BODMAS:

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

这是:

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