1

我想通过他们的“外键”(userID)而不是他们的 id 字段来分片集合。我只需要 userID 和 id 的组合是唯一的。但我不确定 mongodb 是否可以。

警告在您不按 _id 字段分片的任何分片集合中,您必须确保 _id 字段的唯一性。确保 _id 始终唯一的最佳方法是使用 ObjectId 或其他通用唯一标识符 (UUID)。

这取自:http ://docs.mongodb.org/manual/tutorial/enforce-unique-keys-for-sharded-collections/#enforce-unique-keys-for-sharded-collections

我必须确保 _id 是唯一的吗?或者如果我总是通过 userID 和 _id 查询就足够了吗?

4

1 回答 1

5

除非您手动替换它们,否则自动生成的 _id 是 UUID,根据文档,它由“4 字节时间戳(自纪元以来的秒数)、3 字节机器 ID、2 字节进程 ID 和3 字节计数器”。

如您所见,唯一的机器 ID 是 UUID 的一部分。这确保了分片中没有两台机器独立创建相同的 UUID(除非它们具有相同的机器 ID - 可能性为 1:16777215 并且当它发生时可以很容易地验证)。理论上你可以拥有重复 UUID 的唯一情况是单个进程在一秒钟内创建超过 2^24(超过 1600 万)个 UUID。

tl; dr:您不必担心重复的 UUID - 正如文档所述,它们“设计为在分配时具有相当高的唯一性”。

于 2012-11-11T18:58:52.100 回答