MongoDB ObjectId介绍

官方文档:https://docs.mongodb.com/manual/reference/method/ObjectId/index.html

概述

  • 创建新的ObjectId

  • 获取文档的时间戳

  • ObjectId十六进制字符串表示形式

> db.col.find()
{ "_id" : ObjectId("56c56dd4ca446fab71e4c38a"), "x" : 1, "y" : 3 }
{ "_id" : ObjectId("56c572c2ca446fab71e4c38b"), "x" : 2, "y" : 2 }
{ "_id" : ObjectId("56c572c8ca446fab71e4c38c"), "x" : 3, "y" : 1 }
{ "_id" : ObjectId("56c5a7beb708aa3d13c61cc7"), "c" : 3, "m" : 1 }

每个文档中都有一个“_id”,她是一个12字节的BSON类型数据,格式如下

56c56dd4ca446fab71e4c38a

  • 前4个字节表示时间戳

  • 接下来的3个字节是机器标识码

  • 紧接的两个字节由进程id组成(PID)

  • 最后三个字节是随机数

ObjectId使用12字节的存储空间,其生成方式如下:

0 1 2 3 4 5 6 7 8 9 10 11
时间戳 机器ID PID 计数器

MongoDB存储的文档必须有一个的“_id”键,这个键值可以是任意类型,默认的是ObjectId类型对象。

文档的“_id”是唯一的,以确保集合中的文档被唯一标识。

MongoDB采用ObjectId,而不是其他比较常规的做法(比如自动增加的主键)的主要原因,因为在多个服务器上同步自动增加主键值既费力还费时。(不同机器可以通过机器名区分,同一个机器通过时间戳、随机数、进程id区分)

创建新的ObjectId

> newObjectId_1 = ObjectId()
ObjectId("56c686d264799370c0ef357b")
> newObjectId_2 = ObjectId()
ObjectId("56c686d364799370c0ef357c")

可以用已经生成的id取代自动生成的ObjectId

d = ObjectId("56c686d364799370c0ef357c")
ObjectId("56c686d364799370c0ef357c")

获取文档的时间戳

由于ObjectId的前4位是时间戳,因此不需要为文档特意的保存时间戳,可以用getTimestamp()获取

> ObjectId("56c56dd4ca446fab71e4c38a").getTimestamp()
ISODate("2016-02-18T07:08:04Z")

ObjectId返回对象的十六进制字符串表示形式

> new ObjectId().str
56c68c3b64799370c0ef3581
> ObjectId("56c56dd4ca446fab71e4c38a").str
56c56dd4ca446fab71e4c38a

 使用默认_id进行排序

如果使用了默认的ObjectId作为_id值,而你又希望通过insert的时间进行排序查询,那么一切就简单了,你可以直接使用_id字段进行排序,因为它本身是按insert的时间自增生成的。

> // 获取最新加入的10条记录
> db.mycollection.find().sort({id:-1}).limit(10);
赞(52) 打赏
未经允许不得转载:优客志 » 数据库
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏