如何在Azure Cosmos MongoDB中对Decimal128类型字段聚合求和?
Azure Cosmos MongoDB中Decimal128字段聚合求和解决方案
Azure Cosmos DB的MongoDB API对Decimal128类型字段直接使用$sum聚合会出现返回0或“期望整数”的错误,这是因为$sum默认对Decimal128类型的支持存在局限,需要通过类型转换或高精度累加方式处理。
方法1:转换为Double类型求和(适合对精度要求不高的场景)
通过$toDouble将Decimal128字段转为Double类型后再求和,示例语句:
data.aggregate([ { $group: { _id: null, totalAmount: { $sum: { $toDouble: "$amount" } } } } ])
也可以先通过投影转换类型,再执行聚合,逻辑更直观:
data.aggregate([ { $project: { amountDouble: { $toDouble: "$amount" } } }, { $group: { _id: null, totalAmount: { $sum: "$amountDouble" } } } ])
方法2:保留Decimal128高精度求和(适合金融等高精度场景)
如果需要避免Double类型的精度损失,可以先收集所有字段到数组,再用$reduce结合$add做原生Decimal128累加:
data.aggregate([ { $group: { _id: null, amountList: { $push: "$amount" } } }, { $project: { totalAmount: { $reduce: { input: "$amountList", initialValue: { $toDecimal: "0" }, in: { $add: ["$$value", "$$this"] } } } } } ])
这种方式的求和结果依然是Decimal128类型,完全保留精度。
内容的提问来源于stack exchange,提问作者justin.m.chase
相关产品推荐
相关产品推荐

