如何计算有条件的金额?
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
或正数值。
只有当 amountIn
和 amountOut
字段为正时,我才需要计算其总和。
目前我是这样做的:
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)
我在MongoDB中有这样的文件:
{
"_id":{
"$oid":"614e0f8fb2f4d8ea534b2ccb"
},
"userEmail":"abc@example.com",
"customId":"abc1",
"amountIn":10,
"amountOut":0,
"createdTimestamp":1632505743,
"message":"",
"status":"ERROR",
}
amountOut
字段可以是 0
或正数值。
只有当 amountIn
和 amountOut
字段为正时,我才需要计算其总和。
目前我是这样做的:
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
:
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)