MongoDB自动生成12字节的BSON格式_id,以便在插入时未提供此字段时用作文档的主键。 我的问题是: -1我可以配置MongoDB为主键生成20bytes吗? -2如果没有,我可以强迫" MongoDB通过使用20字节密钥显式分配新文档来存储20字节主键? -3,如果是-2,那么这个版本或MongoDB会抛出异常吗?
答案 0 :(得分:0)
您无法更改内置ObjectId的格式,这是mongoDb默认使用_id的格式。对于问题2和3,您可以在插入时分配自己的问题。 MongoDB不会抛出异常。它必须是唯一的,在它上面有一个唯一的索引,不能是一个数组。来自文档:
_id字段具有以下行为和约束:
By default, MongoDB creates a unique index on the _id field during the creation of a collection. The _id field is always the first field in the documents. If the server receives a document that does not have the _id field first,
然后服务器将字段移动到开头。
The _id field may contain values of any BSON data type, other than an array. Warning To ensure functioning replication, do not store values that are of the BSON regular expression type in the _id field.
以下是存储_id值的常用选项:
- 使用ObjectId。
- 使用自然唯一标识符(如果有)。这样可以节省空间并避免额外的索引。
- 生成自动递增的数字。请参阅创建自动递增序列字段。
在应用程序代码中生成UUID。为了更有效地存储集合和_id索引中的UUID值,
将UUID存储为BSON BinData类型的值。如果符合以下条件,则BinData类型的索引键可以更有效地存储在索引中: 二进制子类型值的范围为0-7或128-135,和 字节数组的长度为:0,1,2,3,4,5,6,7,8,10,12,14,16,20,24或32。
使用您的驱动程序的BSON UUID工具生成UUID。请注意,驱动程序实现可能会实现UUID序列化和 反序列化逻辑不同,可能不完全兼容 与其他司机。有关信息,请参阅驱动程序文档 关于UUID互操作性。
请注意
大多数MongoDB驱动程序客户端都会包含_id字段并生成一个 在将插入操作发送到MongoDB之前的ObjectId;但是,如果 客户端发送没有_id字段的文档,mongod将添加 _id字段并生成ObjectId。