如何将 mongodb ID 缩短为更易于解析的语法以在 URL 中使用。该字符串在当前迭代中太长了。
Base64 不错,但还是太长了。我正在寻找 7 个以下字符范围内的更多内容。
我希望能够在 node.js 和浏览器中对其进行编码/解码。
如何将 mongodb ID 缩短为更易于解析的语法以在 URL 中使用。该字符串在当前迭代中太长了。
Base64 不错,但还是太长了。我正在寻找 7 个以下字符范围内的更多内容。
我希望能够在 node.js 和浏览器中对其进行编码/解码。
从请求中解析 ObjectId 并不难(所以我不确定为什么会出现问题?)。如果目标是制作可键入的 URL,那么拥有更短且“更友好”的 URL 将是有价值的。
您不能在分片 MongoDB 设置中采用保证唯一的 12 字节数字并将其压缩到少于 12 个字节并保证它是唯一的(例如,您在七个字符下提到过)。
从文档中,MongoDB ObjectId 包括:
因此,您要么需要牺牲 ObjectId 的某些部分(并因此进行分片),要么设计一种可索引的替代 Id 创建格式。
虽然您可能会再次对 ID 进行哈希处理,但可能会出现您想要编码的冲突(同样,您不能将 12 个字节减少到 4 个字节并保证唯一性)。如果可能存在冲突(并且如果您减少可用的总位数将会出现冲突),那么无论如何您都需要某种辅助表(并且您需要创建一个索引以从生成的 ID 到 ObjectId) .
结果选项:
(不清楚为什么浏览器需要进行这种转换——为什么它会有文档的 ObjectID?)
除了来自 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 将它们减少到