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

Mongoose聚合结果按symbol分组并对balance、usdvalue求和咨询

实现方案

方案1:Mongoose 聚合阶段直接实现(推荐)

直接在原有聚合链后追加3个阶段即可完成分组统计,完整代码如下:

result = await TokenBalance.aggregate([
  // 原有过滤逻辑,这里简化了冗余的$and写法,同一个字段多条件直接合并写效果完全一致
  {
    $match: {
      ethervalue: { $gte: minBalance, $lte: maxBalance }
    }
  },
  { $limit: limit },
  // 新增阶段1:展开balances数组,将每个数组元素拆分为独立的文档
  { $unwind: "$balances" },
  // 新增阶段2:按symbol分组,累加对应字段的总值
  {
    $group: {
      _id: "$balances.symbol",
      balance: { $sum: "$balances.balance" },
      usdvalue: { $sum: "$balances.usdvalue" }
    }
  },
  // 新增阶段3:调整输出字段名,匹配你要求的格式
  {
    $project: {
      _id: 0,
      symbol: "$_id",
      balance: 1,
      usdvalue: 1
    }
  }
])

返回的result就是符合预期格式的结果,无需额外处理。

方案2:Node.js 端处理现有查询结果

如果你不想修改原有聚合逻辑,也可以直接对返回的原始结果做统计,代码如下:

// 原有聚合查询保持不变
const rawResult = await TokenBalance.aggregate([
  {
    $match: {
      ethervalue: { $gte: minBalance, $lte: maxBalance }
    }
  },
  { $limit: limit }
])

// 本地统计逻辑
const statMap = {}
rawResult.forEach(item => {
  item.balances.forEach(balanceItem => {
    const { symbol, balance, usdvalue } = balanceItem
    if (!statMap[symbol]) {
      statMap[symbol] = { symbol, balance: 0, usdvalue: 0 }
    }
    statMap[symbol].balance += balance
    statMap[symbol].usdvalue += usdvalue
  })
})

// 转换为数组格式即为最终结果
const finalResult = Object.values(statMap)

内容的提问来源于stack exchange,提问作者headliner090

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 09:12:02