MongoDB 初学者。
_id: ObjectId("5b486d4057d0e42a3ca9c106")是默认创建的。房产的类型是什么_id?我可以通过什么查询找到/删除它?我可以创建自定义 ID 以节省数据库空间吗?PS:抱歉,如果我含糊其辞,我仍在尝试了解 MongoDB 的工作原理
尽管之前接受的答案正确定义了 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”。请记住这一点,稍后再感谢我;)
| 归档时间: |
|
| 查看次数: |
9707 次 |
| 最近记录: |