我们在使用MongoDB的时候,向集合写入一个文档,发现记录中多出一个_id字段
rs01:PRIMARY> db.t1.insert({name:"mongo"})
WriteResult({ "nInserted" : 1 })
rs01:PRIMARY> db.t1.find()
{ "_id" : ObjectId("5fda07eb82ece2008e8cced6"), "name" : "mongo" }
这个_id就是MongoDB的主键,也就是说它具有唯一性,当我们没有指定_id的值时,系统自动生成一个ObjectId数据类型的值作为_id的唯一标识符
rs01:PRIMARY> db.t1.insert({_id:"hello",name:"mongodb"})
WriteResult({ "nInserted" : 1 })
rs01:PRIMARY> db.t1.find()
{ "_id" : ObjectId("5fda0ac69f39247dfe563624"), "name" : "mongo" }
{ "_id" : "hello", "name" : "mongodb" }
我们看到MongoDB生成的ObjectId类型的值数据很长,它到底是怎么构成的呢? 其实它是一个12字节的十六进制值,在MongoDB的发展过程中ObjectId值构成也发生了改变。在3.4版本开始它的组成是:
4字节值,表示unix时间戳的秒数
5字节的随机数据3字节递增计数器,初始化为随机值
而在3.2版本的组成是:
4字节值,表示unix时间戳的秒数3字节机器标识符2字节的进程ID3字节计数器,以随机值开头。
那ObjectId值为何作出这样的改变呢?随着具有相同MAC地址和以相同顺序启动的进程,这些特定于计算机的5字节信息变得不太可能是随机的,也就是在3.2及之前版本中存在生成相同ObjectId的情况,在3.4及之后的版本中,尽管仍存在这种可能,但是删除了这些计算机信息改用随机数据会增加同一台计算机无法生成相同ObjectId的机会。
参考文档: https://developer.mongodb.com/quickstart/bson-data-types-objectid https://docs.mongodb.com/manual/reference/method/ObjectId/ https://docs.mongodb.com/v3.2/reference/method/ObjectId/
你写得非常清晰明了,让我很容易理解你的观点。