将MongoDB复合键定义为一个键

时间:2018-06-18 11:22:26

标签: mongodb id

在某种程度上可以定义一个复合键,由两个mongoDB objectID或数字类型组成,以便从中创建一个键吗?

这是必要的,因为我有很多参与者创建文档,它们一起保存到一个大集合中,所以我不能确定每个文档的MongoDB对象ID是不同的。所以我想添加一些额外的密钥,可能是一个userID的号码或电子邮件或类似的东西...... 也许是2个ObjectID的

2 个答案:

答案 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,因此也是例外。

另请参阅此答案:Mongodb - must _id be globally unique when sharding

答案 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: