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

如何在MongoDB中计算sum(a)/sum(b)并将结果写入新字段

操作方案

以下基于MongoDB常用版本提供两种不同需求的实现方式:

场景1:将全局sum(a)/sum(b)比值写入原集合所有文档的新字段

版本要求:MongoDB 4.2及以上(支持聚合更新)

直接通过单条updateMany命令完成计算+写入:

db.你的集合名.updateMany(
  {}, // 匹配集合内全部文档
  [
    // 计算全局a、b字段总和,同时暂存所有原文档数据
    {
      $group: {
        _id: null,
        sumA: { $sum: "$a" },
        sumB: { $sum: "$b" },
        docs: { $push: "$$ROOT" }
      }
    },
    // 计算目标比值
    {
      $addFields: {
        ratio_ab: { $divide: ["$sumA", "$sumB"] }
      }
    },
    // 拆分暂存的文档数组,恢复为单文档结构
    { $unwind: "$docs" },
    // 把比值注入原文档后写回集合
    {
      $replaceRoot: {
        newRoot: {
          $mergeObjects: ["$docs", { ratio_ab: "$ratio_ab" }]
        }
      }
    }
  ]
)

低版本兼容方案(MongoDB 4.2以下)

分两步执行:先计算比值,再批量更新

// 第一步:聚合查询得到总和与比值
const statResult = db.你的集合名.aggregate([
  {
    $group: {
      _id: null,
      sumA: { $sum: "$a" },
      sumB: { $sum: "$b" }
    }
  }
]).toArray()[0]
const targetRatio = statResult.sumA / statResult.sumB

// 第二步:把比值写入所有文档的新字段
db.你的集合名.updateMany({}, { $set: { ratio_ab: targetRatio } })

场景2:仅将统计结果单独存储到新集合

如果不需要修改原集合,只需要留存统计值,可以用聚合管道的$out阶段直接写入新集合:

db.你的集合名.aggregate([
  {
    $group: {
      _id: null,
      sumA: { $sum: "$a" },
      sumB: { $sum: "$b" }
    }
  },
  {
    $addFields: {
      ratio_ab: { $divide: ["$sumA", "$sumB"] }
    }
  },
  // 结果写入名为collection_stats的新集合
  { $out: "collection_stats" }
])

你示例中的数据执行后得到的ratio_ab值为2.1875,和你预期的350/160计算结果一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 05:09:02