主键值的数据类型问题,JSON&BSON?

主键值的数据类型问题,JSON&BSON?

看主键值Obj("5da188ebda46b83f50e8fe8d"),应该是一个24位,十六进制的字符串。

问1:为什么说是一个12字节的BSON类型字符串?

问2:计算机底层都是用过二进制存储的,BSON是二进制的存储格式,为嘛不是0和1位单位 ,而是十六进制位单位。

问3:MongoDB是把数据存成16进制,计算机在把16进制存成二进制吗?

问4:JSON是一个序列化的对象或数组。怎么定义成二进制数据类型?

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

2回答
提问者 lin丶林 2019-10-14 16:27:48

ObjectId的值,只有'5da4"是相同的

http://img1.sycdn.imooc.com//climg/5da4314408316de200000000.jpg

  • 提问者 lin丶林 #1
    mongo4.1版本之后,将主机标识3个字节+PID的2个字节,合并成一个整体5个字节,由这5个字节在一起形成的散列值,所以中间十位16进制数不一致。由日期形成的前面4个散列值是相同的。
    2019-10-18 19:20:55
好帮手乔木 2019-10-14 11:12:37

同学你好:

 BSON()是一种类json的一种二进制形式的存储格式,简称Binary JSON。"_id",类型为ObjectId。ObjectId 使用12 字节的存储空间,每个字节两位十六进制数字,是一个24 位的字符串。

1 官方文档:ObjectId的值包含12字节(12 bytes),头4个字节是创建该字段的时间戳。12字节分别如下:

4字节:UNIX时间戳 
3字节:表示运行MongoDB的机器 
2字节:表示生成此_id的进程 
3字节:由一个随机数开始的计数器生成的值 

2 数据的id确实是以二进制的形式存储的,二进制是计算机底层的计算,任何的数字在计算机中计算都要转换成二进制去计算。为了友好的展示存储的_id,因此转换为16进制。

3 Mongodb是以文档的形式存储数据的,他的风格比较类似于JSON。文档类似于编程语言中的键和值的方式联系在一起的。严格意义来讲,MongoDB文档是BSON文档。BSON文档是带有附加类型信息的二进制JSON文档。在文档里,字段的值可以是任何BSON数据类型,他们可以是其他的文档,数组,和数组文档。

http://img1.sycdn.imooc.com//climg/5da3e73b0927769e10510115.jpg

4 BSON是一个类似于JSON的二进制的存储方式,不是讲JSON转换为二进制就是BSON。

文档在计算机的存储形式是以二进制的方式进行存储的。

如果我解决了同学的问题,请采纳!学习愉快。


  • 提问者 lin丶林 #1
    这一句话:”3字节:表示运行MongoDB的机器 ”不对吧。见上面回答的图片,输出的4个主键_id,只有"5da4"相同,所以主机名占用ObjectId的值的前两个字符?
    2019-10-14 16:26:32
  • 好帮手乔木 回复 提问者 lin丶林 #2
    同学你好: 同学可以检查下mongodb的版本。 4.0版本:_id的中间5个字节的规则:hash(3个字节的主机号)+hash(2个字节的进程号),由于主机不变因此,中间的6位不会变化。 4.1以上的版本:_id的中间5个字节的规则:hash(3个字节的主机号+2个自己的进程号)。由于进程号的不同,拼接出的字符串也就不同,再hash,hash出的值就不会相同。如果我解决了同学的问题,请采纳!学习愉快^_^。
    2019-10-15 10:35:49
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师