MongDb存储的文档必须有一个"_id"键(主键)文档的唯一标识

  • 插入文档不存在该键时 会自动创建 可以服务器来做 但通常交由客户端驱动程序完成 原因如下:
  • 虽ObjectId易生成 但是生成则会产生开销
  • MongDb的设计理念是 能从服务器端转移到驱动的 就尽量转移 因为可扩展式数据库 扩展应用层要比扩展数据库容易的多 将事务交由客户端来处理 就减轻了数据库扩展的负担

类型

  • 可以是任何类型 默认是ObjectId对象

ObjectId

  • 轻量型 不同机器可用全局唯一的同种方法生成 MongDb设计上就是做分布式数据库 处理多个节点是核心要求 所以采用ObjectId 替代常规自增主键这种(需要多个服务器 同步自动增加主键) 要更加省时省力
  • 存储空间--12字节:每个字节是两位十六进制数字 所以是一个24位的字符串(ObjectId表示的大小 其实是实际可存储数据的两倍长 所以每次创建其实只有几位数字的变化)
  • 创建方式--12字节创建方式如下
  • 时间戳
  • 标准纪元开始 单位--秒 4个字节 与随后5个字节结合 确认秒级别唯一性
  • "大致"有序 因为时间戳在前 所以ObjectId大致会按照插入顺序排列 (基于这点 设为索引可提高效率) 【注】不是百分百有序
  • 机器
  • 主机唯一标识符 3个字节 一般是主机名的散列值 【保证不同机器ObjectId唯一】
  • PId
  • 进程标识符 2个字节 【保证同台机器不同进程ObjectId唯一】
  • 计数器
  • 自动增加计数器 3个字节 【保证同台机器、同一进程、同一秒产生的ObjectId唯一】 同一秒最多容许同一进程拥有256^3(16 777 216)个不同的ObjectId