You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 23:51:00