如何使用MongoEngine按条件对MongoDB的amount字段求和
首先你现有代码的查询条件存在隐藏错误:同一个字典内重复声明createdTimestamp键,后面的$lte条件会覆盖前面的$gte条件,实际运行时只会执行时间小于等于的过滤,正确的条件写法如下:
query = { 'createdTimestamp': {'$gte': 1632430800, '$lte': 1632517200} }
原有实现速度慢的核心原因是需要把符合条件的所有文档全部拉取到应用层再遍历计算,数据量大时IO和计算开销都很高。你可以直接使用MongoDB聚合管道把计算逻辑推到数据库服务端执行,性能会有明显提升,实现代码如下:
# 定义聚合管道 pipeline = [ # 第一步:过滤符合时间范围的文档 {"$match": query}, # 第二步:按规则累加总金额 {"$group": { "_id": None, "total_amount": { "$sum": { "$cond": [ {"$gt": ["$amountOut", 0]}, # 判断条件:amountOut大于0 "$amountOut", # 条件成立时取amountOut累加 "$amountIn" # 条件不成立时取amountIn累加 ] } } }} ] # 执行聚合查询 result = list(db.RecordModel.objects.aggregate(*pipeline)) # 取出结果,无匹配数据时默认返回0 total_amount = result[0]["total_amount"] if result else 0
该方案所有计算逻辑都在MongoDB服务端完成,仅返回最终求和结果,不需要传输全量文档数据,是这类统计需求的最优实现方式。
内容的提问来源于stack exchange,提问作者nosheyakku
相关产品推荐
相关产品推荐

