MySQL利润求和查询转MongoDB聚合返回null问题求助
错误原因
$group阶段仅保留了_id字段,原文档的credit、rate字段在分组后全部丢失,后续阶段无法读取字段值,导致计算结果为null- 算术表达式写法错误:
'$rate-$100'是普通字符串,不会被MongoDB解析为减法运算,需要使用$subtract操作符实现数值计算 - 求和逻辑位置错误:
$sum需要在分组阶段对每个匹配的文档计算后累加,分组完成后再求和无有效数据源 - 缺少原SQL的
accountNum=$id过滤条件,且accountNum为ObjectId类型,直接传入字符串会匹配失败 - 原SQL计算逻辑是
credit*(100-rate)/100,你的代码写反了减法顺序,变成了credit*(rate-100)/100,结果会是负数
正确聚合查询(与原SQL逻辑完全对齐,查询指定账号总利润)
const mongoose = require('mongoose'); // 注意传入的id需要转换为ObjectId类型,否则无法匹配schema中定义的ObjectId类型的accountNum const targetAccountId = mongoose.Types.ObjectId(id); const profit = await roznamcha.aggregate([ { $match: { accountNum: targetAccountId, rate: { $ne: 0 } } }, { $group: { _id: '$accountNum', totalProfit: { $sum: { $divide: [ { $multiply: ['$credit', { $subtract: [100, '$rate'] }] }, 100 ] } } } } ])
如果你需要查询所有账号的各自总利润,只需要删除$match阶段中的accountNum过滤条件即可。
内容的提问来源于stack exchange,提问作者maliha arash
相关产品推荐
相关产品推荐

