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
相关产品推荐
相关产品推荐

