背景

新老项目切换,有些历史数据是来源于mongo导入,保证唯一的前提下兼容Mysql Long类型的id

Mongo ObjectId的组成

Mongo ObjectId转Mysql Long类型Id方案_进制

ObjectId是16进制编码

解决方法

Mongo ObjectId占用12字节,Mysql Long占用8个字节,首先将ObjectId的16进制转为2进制,再将12字节裁剪为8字节

  1. 考虑数据库都是一机一实例部署,去掉进程PID所占用的2个字节
  2. 考虑项目数据初始数据起始时间为2019年,裁剪时间戳的起始位:
  • 将2019-01-01 00:00:00转为秒级时间戳1546272000
  • 2022-10-01 00:00:00转为时间戳为1664553600
  • 相减得到118281600
  • 转为2进制为11_1000_0110_0110_1010_1100_0000,仅占2字节,不够字节的位数补10
  • 最终为1011_1000_0110_0110_1010_1100_0000,转为10进制193358528

至此完成ObjectId到Mysql Long的映射

数据库的顺序写入会被打破,影响性能,需要根据场景评估

或者缺少的两位不补位10,11_1000_0110_0110_1010_1100_0000转成10进制为59140800