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

如何用Python在MongoDB中通过Lookup统计指定公司交易总额

MongoDB 统计指定公司交易总额(含无交易公司)

我有两个MongoDB集合:

  • Transactions:存储大量交易数据
  • Companies:存储某指数的指定公司列表(部分公司可能无交易记录)

两个集合通过ISIN字段关联,需要统计Companies中每个公司的交易总额,无交易的公司总额显示为0。尝试用$lookup操作但未成功,求可行方案。

集合示例

Transactions集合

{"_id": "1", "Name": "Company 1", "ISIN": "123456789111", "transactionAmount": "14000"}
{"_id": "2", "Name": "Company 1", "ISIN": "123456789111", "transactionAmount": "180000"}
{"_id": "3", "Name": "Company 2", "ISIN": "123456789115", "transactionAmount": "23400"}
{"_id": "4", "Name": "Company 3", "ISIN": "123456789117", "transactionAmount": "1000"}

Companies集合

{"_id": "c1", "Name_short": "Comp 1", "ISIN": "123456789111"}
{"_id": "c2", "Name_short": "Comp 2", "ISIN": "123456789115"}
{"_id": "c3", "Name_short": "Comp 3", "ISIN": "123456789117"}
{"_id": "c4", "Name_short": "Comp 4", "ISIN": "123456789118"}

预期结果

{"Name": "Company 1", "ISIN": "123456789111", "transactionAmount": "194000"}
{"Name": "Company 2", "ISIN": "123456789115", "transactionAmount": "23400"}
{"Name": "Company 3", "ISIN": "123456789117", "transactionAmount": "1000"}
{"Name": "Company 4", "ISIN": "123456789118", "transactionAmount": "0"}

解决方案

核心思路是从Companies集合发起聚合,关联Transactions后统计总额,处理空交易的情况:

db.Companies.aggregate([
  // 关联Transactions集合,匹配ISIN相同的记录
  {
    $lookup: {
      from: "Transactions",
      localField: "ISIN",
      foreignField: "ISIN",
      as: "transactions"
    }
  },
  // 处理无交易的情况,将空数组转为包含一个金额为0的对象(方便后续求和)
  {
    $addFields: {
      transactions: {
        $cond: {
          if: { $eq: ["$transactions", []] },
          then: [{ transactionAmount: "0" }],
          else: "$transactions"
        }
      }
    }
  },
  // 展开交易数组
  { $unwind: "$transactions" },
  // 按ISIN分组,计算总额,同时保留公司名称(取交易中的Name)
  {
    $group: {
      _id: "$ISIN",
      Name: { $first: "$transactions.Name" },
      totalAmount: {
        $sum: { $toInt: "$transactions.transactionAmount" }
      }
    }
  },
  // 关联Companies获取无交易公司的名称
  {
    $lookup: {
      from: "Companies",
      localField: "_id",
      foreignField: "ISIN",
      as: "companyInfo"
    }
  },
  { $unwind: "$companyInfo" },
  // 替换无交易公司的名称为Companies中的Name_short
  {
    $addFields: {
      Name: {
        $cond: {
          if: { $eq: ["$Name", null] },
          then: "$companyInfo.Name_short",
          else: "$Name"
        }
      }
    }
  },
  // 整理输出格式,将总额转为字符串匹配预期结果
  {
    $project: {
      _id: 0,
      Name: 1,
      ISIN: "$_id",
      transactionAmount: { $toString: "$totalAmount" }
    }
  }
])

关键说明

  1. 从Companies发起聚合,确保所有公司都被纳入统计,不会遗漏无交易的公司
  2. 用$cond处理空交易数组,避免后续$sum时出现异常
  3. 由于transactionAmount是字符串类型,需用$toInt转为数字求和,最后用$toString转回字符串匹配预期格式
  4. 针对无交易的公司,用Companies集合中的Name_short填充名称字段

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 23:26:05