MySQL计算利润求和语句转MongoDB聚合查询返回null如何解决
问题原因及修复方案
现有查询的错误点
- 缺少
accountNum过滤条件:原SQL有accountNum=$id的过滤规则,现有聚合的$match阶段仅过滤了rate≠0,导致返回所有账户的聚合结果 $group阶段使用错误:仅指定_id为accountNum会丢失credit、rate等原始字段,后续$addFields阶段无法读取到这两个字段,导致resultMultiply返回null- 表达式写法错误:MongoDB不支持直接写
'$rate-$100'这类字符串表达式,算术运算需要使用对应的操作符实现 - 计算逻辑错误:原业务逻辑是
100-rate,现有写法逻辑颠倒,且$sum的调用位置错误,无法实现累加效果
正确聚合查询写法
单账户总利润查询(和原SQL逻辑一致)
const profit = await roznamcha.aggregate([ // 第一步:过滤符合条件的记录,和SQL逻辑完全对应 { $match: { accountNum: $id, // 替换为你实际传入的账户id变量 rate: { $ne: 0 } } }, // 第二步:计算单条记录的收益 { $addFields: { singleProfit: { $divide: [ { $multiply: ['$credit', { $subtract: [100, '$rate'] }] }, 100 ] } } }, // 第三步:对所有符合条件的记录求和 { $group: { _id: null, // 因为只查询单个账户,固定_id为null即可 totalProfit: { $sum: '$singleProfit' } } } ]) // 最终获取总收益取值逻辑:profit[0]?.totalProfit || 0
全账户各自总利润批量查询
如果需要同时返回所有账户的利润统计,去掉$match中的accountNum过滤条件,调整$group配置即可:
const profit = await roznamcha.aggregate([ { $match: { rate: { $ne: 0 } } }, { $addFields: { singleProfit: { $divide: [ { $multiply: ['$credit', { $subtract: [100, '$rate'] }] }, 100 ] } } }, { $group: { _id: '$accountNum', totalProfit: { $sum: '$singleProfit' } } } ])
内容的提问来源于stack exchange,提问作者maliha arash
相关产品推荐
相关产品推荐

