在某种程度上可以定义一个复合键,由两个mongoDB objectID或数字类型组成,以便从中创建一个键吗?
这是必要的,因为我有很多参与者创建文档,它们一起保存到一个大集合中,所以我不能确定每个文档的MongoDB对象ID是不同的。所以我想添加一些额外的密钥,可能是一个userID的号码或电子邮件或类似的东西...... 也许是2个ObjectID的
答案 0 :(得分:0)
您可以在_id
字段中使用任何内容。所以这是可能的:
db.collection.insertOne({
_id: {
"first": new ObjectId(),
"second": new ObjectId(),
}
})
_id
字段的默认唯一索引也保证了此类字段的唯一性。
但是,我怀疑这对你的问题是一个很好的解决方案,因为它可能只是推迟潜在的问题(实际上不存在 - 请看这个答案:How to generate unique object id in mongodb)。相反,我建议您让客户创建文档而不明确指定_id
并让MongoDB创建_id
(在服务器端或客户端,具体取决于您的驱动程序和客户端的设置 - 应该首选侧代。这将保证唯一性(即使您进行分片)。
无论如何,你的_id字段总是有一个唯一的索引,所以为了在运行时行为方面处于超级安全的一边,你可以在客户端为一个(几乎不可能的)情况下放置一个重试异常处理程序你最终得到两个相同的_id
s,因此也是例外。
答案 1 :(得分:0)
MongoDb中的ObjectId是十六进制值。
ObjectId()返回一个新的ObjectId值。 12字节 ObjectId值包含:
4-byte value representing the seconds since the Unix epoch, 3-byte machine identifier, 2-byte process id, and 3-byte counter, starting with a random value.
https://docs.mongodb.com/manual/reference/method/ObjectId/
因此,插入文档时将自动生成对象Id。 但是,您可以在插入文档时自定义组合长度为24的十六进制值。
例如,
1DCD6500 -- this can be custom hex identifier
A98AC7 -- another custom hex identifier
2B67 -- another custom hex identifier
A981CE -- Incremental custom hex identifier
现在,如果您尝试插入_id
作为1DCD6500A98AC72B67A981CE
的文档。该文件将被保存。
e.g。 { "_id" : ObjectId("1DCD6500A98AC72B67A981CE"), "name" : "sample", "personid" : 39 }
因此,基于ObjectId的定义,您可以创建自定义ObjectId。 但在这种情况下,您将负责确保 ObjectId是唯一的,否则mongodb会抛出错误
"E11000 duplicate key error collection: