现象
mongo数据库中存储的id(自定义字段)长度经过雪花算法存储的是19为超长数据,但是在查询时却出现了异常情况,使用其他的数字也能查询到对应的业务数据,表示很奇怪。
排查过程
一、 数据查询
1、使用错误数据进行查询
如图一,能够正常查询出对应的数据,并且完全一致
2、使用正常是数据查询
也能够正常查询出来对应的数据,对此表示较为疑惑。
二、确定数据类型
确定数据是int64类型并且发现此时数据转换为numberLong长整型,于是针对数据类型进行强转进行查询,具体sql如下:
db.getCollection("intrusion_system_shell_event").find({"id" : NumberLong('368010171051606000')})
结果:不能查询出结果
db.getCollection("intrusion_system_shell_event").find({"id" : NumberLong('368010171051606016')})
结果:能正确查询结果
猜疑:
因查询时并未指定具体数据类型进行查询,是否mongo针对数字类型存在隐性转换。
验证:
使用网址 https://www.exploringbinary.com/floating-point-converter/
针对进行数据转换发现 368010171051606000 的 Double类型正是 368010171051606016。
此时也能解释为什么使用 368010171051606000 查询数据的情况下也能够正确查询出对应的数据,其实是否也是侧方印证Mongo底层是否针对数字的处理一律按照Douber类型进行了统一转换后处理。