2

如何将 mongodb ID 缩短为更易于解析的语法以在 URL 中使用。该字符串在当前迭代中太长了。

Base64 不错,但还是太长了。我正在寻找 7 个以下字符范围内的更多内容。

我希望能够在 node.js 和浏览器中对其进行编码/解码。

4

2 回答 2

3

从请求中解析 ObjectId 并不难(所以我不确定为什么会出现问题?)。如果目标是制作可键入的 URL,那么拥有更短且“更友好”的 URL 将是有价值的。

您不能在分片 MongoDB 设置中采用保证唯一的 12 字节数字并将其压缩到少于 12 个字节并保证它是唯一的(例如,您在七个字符下提到过)。

文档中,MongoDB ObjectId 包括:

  • 一个 4 字节的时间戳
  • 一个 3 字节的机器标识符
  • 一个 2 字节的进程 ID
  • 和一个 3 字节计数器。

因此,您要么需要牺牲 ObjectId 的某些部分(并因此进行分片),要么设计一种可索引的替代 Id 创建格式。

虽然您可能会再次对 ID 进行哈希处理,但可能会出现您想要编码的冲突(同样,您不能将 12 个字节减少到 4 个字节并保证唯一性)。如果可能存在冲突(并且如果您减少可用的总位数将会出现冲突),那么无论如何您都需要某种辅助表(并且您需要创建一个索引以从生成的 ID 到 ObjectId) .

结果选项:

  • 删除通常有效的位——如果你这样做,不要对集合进行分片
  • 设计自己的唯一 ID 解决方案(如果它在网络农场中,它可能最终看起来与 MongoDB 的处理唯一性非常相似)
  • 使用 ObjectId 作为一个长数字并在其上运行一个缩短算法(它需要首先分解成更小的块,因为它超过了 JavaScript 的 53 位数字精度),例如尝试这个算法 =对它进行编码(最终会在17 个字符)
  • 使用其他更短但唯一的 ID 作为文档的 ID
  • 最简单:只要接受 Id 很长。:)

(不清楚为什么浏览器需要进行这种转换——为什么它会有文档的 ObjectID?)

于 2013-01-13T20:31:16.510 回答
0

除了来自 WiredPrairie 的回答,

您可以从十六进制表示更改为 base64 表示。它表示 16 个字符中的 12 个字节,从 24 个十六进制。它不如7,但它是一个开始。甚至还有一个库可以帮助解决这个问题 -> base64-mongo-id

如果将 + 和 / 替换为 - 和 _,则 5f20318f5b100c5f7ed80e44 将缩短为 XyAxj1sQDF9+2A5E 或 XyAxj1sQDF9-2A5E。

但请注意,如果您使用 base 64,则 URL 将区分大小写。如果您想避免这种情况,您可以使用不区分大小写但会更长的 base36,即 20 个字符,将 5f20318f5b100c5f7ed80e44 表示为 L4QDDD23CAGF67WYBZCA。

如果您需要较短的编码,并且如果您可以处理 URL 中的大小写敏感和特殊字符,则可以使用 base85 即 ASCII 直接编码数据或更高阶编码,如 base 91 和 base 122 将它们减少到

于 2020-07-28T14:29:36.637 回答