当前位置: 首页 > 面试题库 >

在JavaScript中缩短MongoDB ID

景令秋
2023-03-14
问题内容

如何将mongodb ID缩短到更容易解析语法的URL中。该字符串在当前迭代中太长。

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

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


问题答案:

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

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

从文档中,MongoDB ObjectId包括:

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

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

虽然您可能会散列ID,但再次可能会产生您希望为其编码的冲突(再次,您不能将12个字节缩减为4个字节并保证唯一性)。并且,如果可能发生冲突(并且减少可用位数的总和),那么无论如何您都将需要某种二级表(并且需要创建一个索引来将生成的ID转换为ObjectId)

结果选项:

  • 删除通常有效的位-如果这样做, 请勿 将集合分片
  • 设计自己的独特ID解决方案(如果位于网络农场中,则最终看起来可能与MongoDB非常相似以处理唯一性)
  • 将ObjectId用作长整数并对其运行缩短的算法(由于它超出了JavaScript的53位数字精度,因此需要首先分解为较小的块),例如,尝试使用该算法=对其进行编码(最终会在周围17个字符)
  • 使用其他更短但更独特的名称作为您文档的ID
  • 最简单:只需接受ID长即可。:)

(尚不清楚为什么浏览器需要进行此转换-为什么要具有文档的ObjectID?)



 类似资料:
  • 问题内容: 我对JavaScript中的字符串操作不太满意,我想知道如何在不删节的情况下缩短字符串。我知道如何使用子字符串,但不知道indexOf或其他任何很好的方法。 说我有以下字符串: 我想将其缩减为10个字符,但是如果它不以空格结尾,请完成该单词。我不希望字符串变量看起来像这样: “这是我不能忍受的长字符串” 我希望它在出现空格之前将单词结束。 问题答案: 如果我理解正确,则希望将字符串缩短

  • 我有一个字符串: 它需要缩短,所以看起来像这样: 所以基本上,它需要使用所有重复的字符,并写下它们重复的次数,而不是打印它们。我设法做到了一半: 但这只适用于重复的字符,而不是模式。我可以通过在字符串中找到ab模式来做到这一点,但这需要对每一个可能的字符串都是可行的。有人遇到过类似的事情吗?

  • 问题内容: 在Google文档(https://developers.google.com/url- shortener/v1/getting_started )中,要使用Google URL缩短器,我应该发出如下请求: POST https://www.googleapis.com/urlshortener/v1/url 内容类型:application / json {“ longUrl”:“

  • 以前,我使用下面的动态链接在我的应用程序中启动一个想要的页面 然而,这有一个缺点,对于没有安装我的应用程序的用户。对于没有安装我的应用程序的用户,这是当他点击链接时发生的情况 转到Google Play商店 安装应用程序。 启动应用程序。将转到应用程序的第一页,而不是在“深度链接”中指定的所需页面。 后来,我意识到Firebase动态链接可以解决我的问题。如果我使用下面的URL,一切正常。 对于第

  • 我已经从CodeIgniter发送了一封电子邮件,但我不知道为什么我的电子邮件会被截断,或者它会被包含在带有问号的黑钻石中。这是真的,我使用波斯字符,但标题是utf-8无论如何。下面是发送电子邮件的CodeIgniter代码: 只要注意主题中的非拉丁字符:

  • 问题内容: 我正在寻找一个PHP函数,该函数可从字符串或文件中创建短哈希,类似于那些诸如tinyurl.com之类的URL缩短网站。 哈希不得超过8个字符。 问题答案: URL缩短服务宁可使用自动递增的整数值(例如补充数据库ID),并使用Base64或其他编码对其进行编码,以使每个字符具有更多信息(64而不是仅10个数字)。