如何用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" } } } ])
关键说明
- 从
Companies发起聚合,确保所有公司都被纳入统计,不会遗漏无交易的公司 - 用
$cond处理空交易数组,避免后续$sum时出现异常 - 由于
transactionAmount是字符串类型,需用$toInt转为数字求和,最后用$toString转回字符串匹配预期格式 - 针对无交易的公司,用
Companies集合中的Name_short填充名称字段
内容的提问来源于stack exchange,提问作者wagadagalu
相关产品推荐
相关产品推荐

