Mongo数据库中“_id”字段的类型是什么?

Par*_*yar 0 mongodb

MongoDB 初学者。

  • 创建本地 MongoDB 服务器
  • 使用 Mongoose 创建模式
  • _id: ObjectId("5b486d4057d0e42a3ca9c106")是默认创建的。

房产的类型是什么_id?我可以通过什么查询找到/删除它?我可以创建自定义 ID 以节省数据库空间吗?PS:抱歉,如果我含糊其辞,我仍在尝试了解 MongoDB 的工作原理

Sub*_*han 5

_id 是生成的默认键,用于唯一标识集合中的每个文档。12 字节的 ObjectId 是一个十六进制字符串值,由以下部分组成:

  • 一个 4 字节值,表示自 Unix 纪元以来的秒数,
  • 3字节机器标识符,
  • 2 字节进程 ID,以及
  • 一个 3 字节计数器,以随机值开始。

如需更多参考,请浏览此处的文档。


Vic*_*der 5

尽管之前接受的答案正确定义了 anObjectId是什么,但最初的问题是问“ _idMongoDB 数据库中字段的类型是什么?”,因此之前的答案是不完整的。

该字段是强制性的、不可变的,并且在 MongoDB 集合中具有唯一性约束。这就是关系数据库中的“主键”。

ObjectId只是该字段的默认类型。如果您在集合中插入新文档时没有传递一个,MongoDB 将自动为您创建其中一个。这很方便,因为ObjectId创建 s 的方式可以避免冲突并确保始终为文档分配唯一的值。用作主键还有其他优点ObjectId,例如按插入顺序自然排序、嵌入时间戳等。请参阅此处此处

然而,重要的细节是,您也可以在插入文档时传递自己的文档_id,并且它不必是类型ObjectId。事实上,根据MongoDB文档规范它可以是除数组之外的任何类型

字段名称_id保留用作主键;它的值在集合中必须是唯一的,是不可变的,并且可以是除数组之外的任何类型。如果_id包含子字段,则子字段名称不能以 ( $) 符号开头。

最终,这是一个数据库设计决策。使用自动主键可能并不完全是您想要的。事实上,很多时候这恰恰是我们想要的。如果您的记录具有“自然”唯一标识符,您应该认真考虑使用它而不是自动 ID。

使用自动_ids 的最大缺陷是,默认情况下,在没有预定义的情况下重复插入操作_id将在集合中留下具有相同内容的重复文档,仅在_id. 这可以通过创建具有唯一性约束的其他索引来避免,但大多数时候_id在应用程序领域提前决定更方便。

最后,要完全回答这个问题:是的,您完全可以_id在创建新文档时为该字段定义其他值,但以后无法删除或编辑它。要更改分配的文件,_id您必须删除旧文档并使用不同的_id. 此外,任何磁盘空间节省都可能没有任何意义,因为ObjectIds 本身已经非常小(只有 12 字节)。

最后一个重要的提示是通过艰难的方式学到的:如果您使用字典/对象作为_id,它们是顺序敏感的!这意味着与查询时也{"foo": 1, "bar": 1} 不同{"bar": 1, "foo": 1}。对于不保留字典/映射/对象中的键顺序的编程语言,这可能是一个真正的痛苦并导致“Heisenbugs”。请记住这一点,稍后再感谢我;)