章节摘要:本章讲 BSON 数据类型与增删改查。对应两起事故:把金额存成 double 导致对账差一分钱、一条 deleteMany 条件写漏导致整集合被清空。读完本章,你能按类型正确建模字段,并安全地执行 CRUD。
金句:MongoDB 里没有"建表"这一步,但类型的代价一步都不会少——JSON 没有的坑,BSON 全都有配套版本。
先懂类型再动手写:2.1 决定"数据长什么样",2.2 决定"怎么安全地读写它"。两起事故其实互为镜像——一个是写入时类型随手定了、日后对不上账;一个是删除时条件随手丢了、当下就清了库。前者慢性,后者急性,但共同根源都是"MongoDB 不替你把关字段名和类型"。
类型正确(2.1) ──► 操作安全(2.2) │ │ 金额用 decimal 删除先 count 再删
如果只能从本章带走一句话:字段名拼错和类型选错都不会报错,它们只会在几周后以业务故障的形态回来找你。写前的三分钟校对,是对付这两类沉默错误唯一的廉价手段。
离开本章前逐条自查:能否说出金额字段为什么必须用 Decimal128 而不是 double,并解释二进制浮点在 0.1 上的表示误差;能否默写 $type 聚合统计字段类型分布的语句;能否解释 ObjectId 四段构成与近似递增的原因;能否写出防超卖的单文档条件更新;能否说出 deleteMany 前的两步保命动作;能否区分 replaceOne 与 updateOne 的语义差异并说出各自误用的后果;能否把一个深分页接口改写成键集翻页。答不上的条目,回对应小节的事故复盘里再走一遍。
再给代码评审一份三行照妖镜:凡是金额或费率字段,查类型是否 Decimal128;凡是 deleteMany 或 updateMany,查是否先 count 并限定集合与条件;凡是分页用 skip 的,查数据量增长后是否会退化为全表扫描。三行检查覆盖了本章两起事故的全部形态,评审时对号入座即可。
类型事故最阴险之处在于时间差:写入那一刻一切正常,报表和对账几周后才暴露,定位窗口被拉得很长。缩短窗口的办法是在写入侧加校验(第 5 章的 jsonSchema)并在日报里盯类型分布的异常漂移。
前置:第 1 章装好的实例。延伸:CRUD 只是读写原语,查询性能依赖第 3 章的索引,复杂分析依赖第 4 章的聚合。