_id和ObjectId
MongoDB中存储的文档必须有一个”_id”键。这个键的值可以是任何类型的,默认是个ObjectId对象。
在一个集合里面,每个集合都有唯一的”_id”值,来确保集合里面每个文档都能被唯一标识。如果有
两个集合的话,两个集合可以都有一个值为”123”的”_id”的键,但是每个集合里面只能有一个”_id”
是123的文档。

1.ObjectId
ObjectId是”_id”的默认类型。它设计成轻量型的,不同的机器都能用全局唯一的同种方法方便地生成它。
这是MongoDB采用ObjectId,而不是其他比较常规的做法(比如自动增加的主键)的主要原因,因为在多个
服务器上同步自动增加主键值既费力还费时。MongoDB从一开始就设计用来作为分布式数据库,处理多个节
点是一个核心要求。后面会讲到ObjectId类型在分片环境中容易生成得多。
ObjectId使用12字节的存储空间,每个字节两位十六进制数字,是一个24位的字符串。由于看起来很长,不
少人会觉得难以处理。但关键是要知道这个长长的ObjectId是实际存储数据的两倍长。
如果快速连续创建多个ObjectId,会发现每次只有最后几位数字有变化。另外中间的几位数字也会变化(要
是在创建的过程中停顿几秒钟)。这是ObjectId的创建方式导致的。12字节按照如下方式生成:
0|1|2|3 | 4|5|6 | 7|8 | 9|10|11
时间戳 | 机器 | PID | 计数器
前4字节是从标准纪元开始的时间戳,单位为秒。这会带来一些有用的属性。
时间戳,与随后的5个字节组合起来,提供了秒级别的唯一性。
由于时间戳在前,这意味着ObjectId大致会按照插入的顺序排列。这对于某些方面很有用,如将其作为索引提
高效率,但是这个是没有保证的,仅仅是”大致”。这4个字节也隐含了文档创建的时间。绝大多数驱动都会公开
一个方法从ObjectId获取这个信息。
因为使用的是当前时间,很多用户担心要对服务器进行时间同步,其实这个没有必要,因为时间戳的实际值并不
重要,只要其总是不停增加就好了(每秒一次)。
接下来的三个字节是所在主机的唯一标识符。通常是机器主机名的散列值。这样就可以确保不同主机生成不同的
ObjectId,不产生冲突。
为了确保在同一台机器上并发的多个进程产生的ObjectId是唯一的。后3个字节就是一个自动增加的计数器,确
保相同进程同一秒产生的ObjectId也是不一样的。同一秒钟最多允许每个进程拥有256(16777216)个不同的ObjectId。

2.自动生成_id
前面讲到,如果插入文档的时候没有”_id”键,系统会帮你自动创建一个。可以由MongoDB服务器来做这件事情,但
通常会在客户端由驱动程序完成。理由如下:
虽然ObjectId设计成轻量型的,易于生成,但是毕竟生成的时候还是产生开销。在客户端生成体现了MongoDB的设计
理念:能从服务器端转移到驱动程序来做的事,就尽量转移。这种理念背后的原因是,即便是像MongoDB这样的可扩
展数据库,扩展应用层也要比扩展数据库层容易的多。将事务交由客户端来处理,就减轻了数据库扩展的负担。
在客户端生成ObjectId,驱动程序能够提供更加丰富的API。例如,驱动程序可以有自己的insert方法,可以返回生
成的ObjectId,也可以直接将其插入文档。如果驱动程序允许服务器生成ObjectId,那么将需要单独的查询,以确
定插入的文档中的”_id”值。

MongoDB中的_id和ObjectId相关推荐

  1. 将mongodb 中的_id 转化为时间戳

    php手册上给出的示例:https://www.php.net/manual/zh/mongoid.gettimestamp.php, 其他语言也可以参考做转化. <?php $id = new ...

  2. MongoDB中_id(ObjectId)生成

    MongoDB 中我们经常会接触到一个自动生成的字段:"_id",类型为ObjectId. 之前我们使用MySQL等关系型数据库时,主键都是设置成自增的.但在分布式环境下,这种方法 ...

  3. C# 生成 MongoDB 中的 ObjectId

    ObjectId介绍 在MongoDB中,文档(document)在集合(collection)中的存储需要一个唯一的_id字段作为主键.这个_id默认使用ObjectId来定义,因为ObjectId ...

  4. mysql objectid_【Mongodb】_id和ObjectId详解!

    2.6.6 _id和ObjectId MongoDB 中存储的文档必须有一个"_id" 键.这个键的值可以是任何类型的,默认是个ObjectId 对象.在一个集合里面,每个文档都有 ...

  5. 如何获取mongodb中的最后N条记录?

    我找不到任何记录在案的文件. 默认情况下,find()操作将从头开始获取记录. 如何获取mongodb中的最后N条记录? 编辑:我也希望返回的结果从最近到最近排序,而不是相反. #1楼 您可以使用so ...

  6. mongodb中分页显示数据集的学习

    这次继续看mongodb中的分页.首先依然是插入数据: 1) db.Blog.insert( { name : "Denis", age : 20, city : "Pr ...

  7. MongoDB中如何优雅地删除大量数据

    删除大量数据,无论是在哪种数据库中,都是一个普遍性的需求.除了正常的业务需求,我们需要通过这种方式来为数据库"瘦身". 为什么要"瘦身"呢? 表的数据量到达一定 ...

  8. 使用aggregate在MongoDB中查找重复的数据记录

    我们知道,MongoDB属于文档型数据库,其存储的文档类型都是JSON对象.正是由于这一特性,我们在Node.js中会经常使用MongoDB进行数据的存取.但由于Node.js是异步执行的,这就导致我 ...

  9. MongoDB中关于64位整型存储解决方案

    为什么80%的码农都做不了架构师?>>>    社区内一哥们@smcboy 提出关于php中操作MongoDB存储整数问题,找到点资料花点时间翻译过来,是个很好的学习方式.@红薯 那 ...

最新文章

  1. 零基础学编程学java还是python-小白学编程选java、php、前端还是python
  2. thymeleaf+bootstrap,onclick传参实现模态框中遇到的错误
  3. SpringBoot常用配置简介
  4. WOR文件转换成GST文件
  5. linux shell sed d删除指定行并更换分隔符为#
  6. php判断除数是不是整数,五种js判断是否为整数类型方式
  7. pythonkeras数据增强_Keras数据增强参数
  8. 黑色幽默:“新知青”电影《走着瞧》首映
  9. 关得紧紧的 FreeEIM飞鸽传书
  10. html 新浪博客,html
  11. redis rua解决库存问题_技术架构师总结:Redis分布式锁的问题和解决
  12. linux文件系统之mount流程分析
  13. 佛山ABB服务器维修,佛山南海ABB软启动器报故障服务点
  14. PHP字符串函数strrchr(查找指定字符在字符串中的最后一次出现)
  15. 找到投资人的几种途径和方法
  16. 【Python】半次元COS图爬取
  17. Android 俄罗斯方块
  18. RV1126笔记一:环境搭建及SDK编译
  19. 关于Redis数据过期策略
  20. Google Earth Engine—ETOPO1是一个1弧分的地球表面全球浮雕模型,整合了陆地地形和海洋测深。它是由许多全球和区域数据集建立的。它包含两个高程带:冰面和基岩。

热门文章

  1. 网络基础-第三章:认识网线制作工具
  2. 主动式PFC与被动式FPC浅析
  3. iOS优秀的图片压缩处理方案
  4. 深度学习硬件环境配置
  5. wildfly 21中应用程序的部署
  6. 04【Verilog实战】SPI协议底层硬件接口设计(附源码RTL/TB)
  7. SAP批量修改物料标准成本
  8. 推广网站的26种方法
  9. 怎样破解网页禁用鼠标右键
  10. 字节校招面试题分享,别人已经开始面试了,你不会还没有准备吧?