【问题标题】:inserting into a mongodb collection with manually specified _id使用手动指定的 _id 插入 mongodb 集合
【发布时间】:2016-02-23 11:42:29
【问题描述】:

假设我在 mongodb 中有一个集合,并且集合中的对象有一个 _id,它是我以某种完全在 mongoDB 外部的随机方式选择的 ObjectID,例如从 ObjectID 0000 ... 0000 开始并以 10000 递增,或者可能只是使用随机数生成器来制作 ObjectID。

假设我随后将另一个项目添加到集合中,但我没有为新对象记住一个 ObjectID,并且对让系统选择一个感到满意。系统会选择已经是集合一部分的 ObjectID 吗?

如果相关,我正在使用 java API 和 python API 来执行此操作。

【问题讨论】:

  • letting the system pick one - “系统”是指 mongoDB 服务器还是 id 生成器 API?
  • 不幸的是,我不知道系统的哪个组件实际生成了新的 ObjectID。例如,我知道如果我在 java 中插入一些东西,插入的对象会添加一个 ObjectID,但我不知道服务器是否生成 OjbectID,或者 API 是否生成 ObjectID。

标签: mongodb


【解决方案1】:

_id 始终是唯一的。 _id 字段上有一个隐式的唯一主索引。

所以请放心,MongoDB 不会选择已被占用的_id 字段。

_id 字段也是一个 12 字节的十六进制字符串,其中:

  • 4 个字节用于日期时间戳。
  • 3 个字节是 MAC 地址。
  • 2 个字节是进程 ID。
  • 3 个字节是计数器。

因此,如果 MongoDB 为集合中的文档选择 _id,那么它肯定会与集合中其他文档的其他 _id 字段不同。

希望这会有所帮助。

【讨论】:

  • 如果我正在生成随机 ObjectID,是什么阻止了我随机生成 MongoDB 如果留给自己的设备会生成的 ObjectID?例如,假设时间戳中的时间字节碰巧匹配,mac地址中的字节碰巧匹配,进程id中的字节碰巧匹配,并且计数器的字节恰好对应于字节那会出现在柜台上吗? mongoDB 是否注意到这一点并在分发新的 ObjectID 时选择不同的 ObjectID?
  • 嗯...不,它没有。如果您必须将 _id 分配给已经是同一集合中某个其他文档的 _id 的文档,则会给您一个错误。
  • 这种情况极为罕见,系统几乎不可能自行创建重复的_id。就您随机生成的 _id 而言,我认为您无法将您创建的 _id 与 mongodb 创建的 _id 匹配。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多