本文介绍: ObjectId是一种小型的,几乎是唯一的,易于产生和排序数据结构长度是12个字节,由3部分组成4个字节时间戳,表明objectId的创建时间,以秒为单位unix时间5个字节随机字符串,在运行机器上的进程中是唯一的3个字节增长计数器初始值一个随机数其中时间戳和增长计数器与其他BSON类型不同,是按照高位优先排序。如果使用数字类型创建ObjectID, ObjectID中的时间戳,会被数字值来替代。//使用数字类型定义3个ObjectID},{},{}])

使用mongodb时 , 当集合中的文档没有_id字段时,会为文档自动生成一个ObjectId类型的_id日常查询过程中,也能看到_id是ObjectId里带有一段字符串这个字符串代表什么意义,和其他类型的ID有什么相同不同本文研究mongodb官方文档,并通过实践解释ObjectID这个数据类型

ObjectId定义

ObjectId是一种小型的,几乎是唯一的,易于产生和排序数据结构长度是12个字节,由3部分组成

其中时间戳和增长计数器与其他BSON类型不同,是按照高位优先排序

如果使用数字类型来创建ObjectID, ObjectID中的时间戳,会被数字值来替代。

//使用数字类型定义3个ObjectID
db.inventory.insertMany([{
    part: 'AB307',
    _id: ObjectId(1)
},{
    part: 'AB307',
    _id: ObjectId(2)
},{
    part: 'AB307',
    _id: ObjectId(3)
}])

// 产生的id中,数字类型替代了4个字节的时间戳
{
	"acknowledged" : true,
	"insertedId" : ObjectId("000000013e53cb5bc48f4e54")
}
{
	"acknowledged" : true,
	"insertedId" : ObjectId("000000023e53cb5bc48f4e55")
}
{
	"acknowledged" : true,
	"insertedId" : ObjectId("000000033e53cb5bc48f4e56")
}

上面代码的运行结果可以看到,4个字节长度的00000001,00000002,00000003,替代了时间错。而后面3个字节长度的增长计数器,8f4e54,8f4e55,8f4e56在每一条纪录插入时,都会增长。而中间3e53cb5bc4这个长度为5个字节的字符串,是由运行机器进程随机产生的字符串

时间戳+随机字符串+自增字符串,保证了objectId的唯一性。

文档中的ObjectId

Mongodb的每一个文档需要唯一_id字段作为主键。如果没有_id字段mongodb自动加一个ObjectId作为_id字段。这对于设置{upsert:true}的更新语句插入数据同样适用。

使用ObjectId作为_id字段的好处

//运行代码
ObjectId("655ef22e69185fac9ce3ce92").getTimestamp()
//获取创建时间
ISODate("2023-11-23T14:33:18.000+08:00")

ObjectId的单调

ObjectId虽然按照时间来产生,并带有随机数保证其唯一性。但objectId并不是单调的,受到两个因素影响

原文地址:https://blog.csdn.net/wilsonzane/article/details/134786699

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_43390.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注