MongoDB中的_id字段

在MongoDB中,_id字段是表示一个集合的主键【类似MySQL中的id字段】,可以唯一标识每个文档。_id字段包含唯一的ObjectID值。

使用默认的_id——ObjectId

默认情况下,在集合中插入文档时,如果字段名中没有_id的字段名称,则MongoDB将自动添加一个ObjectId字段。
ObjectId是轻量型的,不同的机器都能全局唯一的生成它;ObjectId使用12字节的存储空间。


ObjectId各个字节表示的含义.png

0-3字节:表示时间戳
4-6:表示主机的唯一标识符。【确保不同主机生成的ObjectId是唯一的】
7-8:表示进程id。【确保同一机器上并发的多个进程产生的ObjectId是唯一的】
9-11:表示计数器。【确保同一机器上同一进程同一秒产生的ObjectId是唯一的】

好处:适用于分布式数据库
示例:

> db.jihe1.find().pretty().limit(1)
{
        "_id" : ObjectId("5febdaec4747ad3af6c87d7b"),
        "user_id" : 0,
        "user_name" : "name0",
        "user_password" : "password0",
        "user_other" : "other0"
}
> 

将ObjectId中的前四个字节的十六进制转换成十进制【5febdaed->1609292524】,表示的秒级别的时间戳。
将时间戳转换成日期的时间【1609292524->2020-12-30 09:42:04[北京时间]】

总结:

1.ObjectId前9个字节提供了秒级别的唯一性。
2.当连续插入多个document的时候,会发现只有后面的3个字节在变化。

自定义_id字段

我们向一个集合中添加文档时,显示的创建“_id”字段时,文档中不会默认生成_id字段,而是使用我们指定的"_id"

> db.jihe1.insert({_id: 1, user_id: 0, user_name: "name00", user_password: "password00", user_other: "other00"})
WriteResult({ "nInserted" : 1 })
> db.jihe.find({_id: 1}).pretty()
> db.jihe1.find({_id: 1}).pretty()
{
        "_id" : 1,
        "user_id" : 0,
        "user_name" : "name00",
        "user_password" : "password00",
        "user_other" : "other00"
}
>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容