应使用 Decimal128 存储金额,因其能精确表示34位十进制数,避免 double 的精度丢失和 int 存分的跨币种缺陷;MongoDB 原生支持,但需用字符串构造、注意驱动版本及聚合中类型混用降级问题。用 Decimal128 存金额,别用 double 或 int金融场景下,double 会丢失精度(比如 19.99 + 0.01 可能算出 19.999999999999996),int 存分又容易在跨币种、小数位不一致(如日元无小数、比特币支持8位)时硬编码出错。MongoDB 原生支持 Decimal128,它按 IEEE 754-2008 实现,能精确表示任意 34 位十进制数,且服务端运算也保持精度。实操建议:插入时必须用 Decimal128 构造器,不能靠 driver 自动转换(例如 Node.js 的 new Decimal128("123.45"),不是 new Decimal128(123.45) ------ 后者仍是浮点字面量)查询聚合时,sum、avg 等累加操作对 Decimal128 字段天然支持,结果仍是 Decimal128;但若混入 int 字段,整个结果会降级为 double注意驱动兼容性:Python PyMongo ≥ 3.4、Node.js MongoDB Driver ≥ 3.0、Java Driver ≥ 3.4 才完整支持 Decimal128 序列化/反序列化流水记录加签名字段 hash 和 prev_hash 防篡改单靠数据库权限控制无法防止管理员或内鬼修改历史流水。需要在应用层写入时生成可验证的链式哈希:每条记录包含自身内容的 SHA-256(不含 _id 和 hash 字段),以及上一条流水的 hash 值。这样任意一条被改,后续所有 prev_hash 校验都会失败。实操建议:计算 hash 时,必须固定字段顺序、统一 JSON 序列化格式(推荐使用严格模式,如 Python 的 json.dumps(..., sort_keys=True, separators=(',', ':'))),否则同样数据生成不同哈希prev_hash 初始值设为空字符串或全零 "0000000000000000000000000000000000000000000000000000000000000000",第一条流水靠此识别不要把私钥存在数据库里;签名用的密钥应由 KMS 或 HSM 托管,应用只调用签名接口校验逻辑不应只查单条,而应从最新一条倒推,直到 prev_hash 为空 ------ 中间任一环断裂即说明被篡改索引设计要覆盖高频查询路径:时间范围 + 账户 + 状态交易流水最常查的是「某账户近7天的成功入账」或「某笔订单关联的所有流水」,单一 _id 索引完全不够。但建太多复合索引又拖慢写入,尤其金融系统写入压力大。 标贝科技 标贝科技-专业AI语音服务的人工智能开放平台
相关推荐
renhongxia117 分钟前
世界模型,是“空中楼阁”还是AGI的“最后一块拼图”?程序员无隅26 分钟前
Coding Agent 为什么压缩上下文后还能继续工作?上下文模块设计拆解Python+9936 分钟前
Java 枚举类(Enum)详解:从基础到高级应用愿做无知一猿1 小时前
Nacos连接MySQL异常?DataGrip竟成救星G.O.G.O.G1 小时前
LeetCode SQL 从入门到精通(MySQL)06(上)dunge20261 小时前
2026年7月最新ChatGPT Plus / Pro 与 Codex:当 AI Agent 最新5.6版本来袭,必须理解事务、幂等与补偿研究员子楚1 小时前
GEO行业发展标准体系白皮书V2.0-第10卷 · 全球篇:跨国标准协同与全球品牌语义治理框架Omics Pro2 小时前
深度学习多组学互作:组内+组间小白学大数据3 小时前
两周完成爬虫技术栈升级:Scrapy 迁移 Crawlo 的路径与取舍用户8356290780513 小时前
使用 Python 在 Excel 中添加和自定义文本框