使用MongoDB开发过程常见错误分析
本文主要讨论这几个问题: Mongo shell中使用大整数字面量 片键使用自增长字段 程序里游标循环迭代过程中进行长时间的操作 滥用数组类型 滥用upsert更新参数 错误的设计索引 错误的认为复制等于备份 (本文讨论在社区交流群以及工作开发过程中常见的一些错误。) Mongo shell中使用大整数字面量,但默认整数字面量类型却是双精度浮点数,导致丢失精度 问题描述: 通过mongo shell插入或更新一个大整数(长度约大于等于16位数字)时,例如: 但实际上查询发现,插入的123456789111111111变为另外一个值123456789111111100,如下: 分析: 由于mongo shell实际上是一个js引擎,而在javascript中,基本类型中并没有int或long,所有整数字面量实际上都以双精度浮点数表示(IEEE754格式)。64位的双精度浮点数中,实际是由1bit符号位,11bit的阶码位,52bit的尾数位构成。 11bit的余-1023阶码使得双精度浮点数提供大约-1.7E308~+1.7E308的范围,52bit的尾数位大概能表示15~16位数字(部...