如何计算有条件的金额?

How to calculate the amount with conditional?

我在MongoDB中有这样的文件:

{
    "_id":{
        "$oid":"614e0f8fb2f4d8ea534b2ccb"
    },
    "userEmail":"abc@example.com",
    "customId":"abc1",
    "amountIn":10,
    "amountOut":0,
    "createdTimestamp":1632505743,
    "message":"",
    "status":"ERROR",
}

amountOut 字段可以是 0 或正数值。 只有当 amountInamountOut 字段为正时,我才需要计算其总和。
目前我是这样做的:

query = {
    'createdTimestamp': {'$gte': 1632430800},
    'createdTimestamp': {'$lte': 1632517200}
}
records = db.RecordModel.objects(__raw__=query).all()

total_amount = 0
for record in records:
    if record.amountOut > 0:
        total_amount += record.amountOut
    else:
        total_amount += record.amountIn

但这很慢。
我知道 mongoengine 有一个 sum 方法:

total_amount = db.PaymentModel.objects(__raw__=query).sum('amountIn')

但是我不知道如何使用这个方法的条件。
也许还有其他一些方法可以更快地计算出我需要的条件?

您可以使用 mongoengine 的 aggregation api,它只允许您正常执行聚合。

现在您可以在利用 $cond:

的代码中使用 this 管道
query = {
    'createdTimestamp': {'$gte': 1632430800, '$lte': 1632517200},
}
pipeline = [
    {"$match": query},
    {
        "$group": {
            "_id": None,
            "total_amount": {
                "$sum": {
                    "$cond": [
                        {
                            "$gt": [
                                "$amountOut",
                                0
                            ]
                        },
                        "$amountOut",
                        "$amountIn"
                    ]
                }
            }
        }
    }
]

records = db.RecordModel.objects().aggregate(pipeline)

Mongo Playground