为何MongoDB添加文档时生成ID对象而非单个标识符?
为什么MongoDB生成的ID是对象形式而非单个值?
你看到的是MongoDB的ObjectId,它本质是一个12字节的唯一标识符,之所以显示成对象形式,是因为你使用的客户端/驱动把它封装成了便于操作的对象类型,但实际在MongoDB集合里,它是以二进制数据形式存储的单个_id字段。
ObjectId的12字节结构:
- 前4字节是时间戳(精确到秒),可快速判断文档创建时间
- 接下来3字节是机器标识符,避免不同机器生成重复ID
- 再2字节是进程ID,防止同一机器不同进程生成重复ID
- 最后3字节是计数器,保证同一秒内同一进程生成的ID唯一
显示形式差异:不同工具对ObjectId的展示不同,比如MongoDB Shell会显示成
ObjectId("60d21b4667d0d8992e610c85")这样的对象格式,你可以调用toString()获取它的字符串形式,也能直接用这个对象做查询(比如db.collection.find({_id: ObjectId("xxx")}))。
你认为ID是唯一值的想法没错,ObjectId本身就是满足唯一性要求的标识,封装成对象是为了提供更多便捷操作,比如提取创建时间等。
内容的提问来源于stack exchange,提问作者Mazin Ismail
相关产品推荐
相关产品推荐

