如何为Firestore中的文档制作自定义自动生成的ID

时间:2019-04-20 12:46:16

标签: reactjs firebase google-cloud-firestore

对于我的项目,我需要可以轻松共享的ID,因此firestores默认自动生成的ID无法使用。
我正在寻找一种自动生成8329423之类的ID的方法,该ID可以在0到9999999的范围内递增或随机选择。

1 个答案:

答案 0 :(得分:1)

Firestore的自动ID字段旨在统计地确保没有两个客户端会生成相同的值。这就是为什么它们要长久的原因:它是为了确保它们中有足够的随机性(熵)。

这使Firestore可以完全在客户端确定这些密钥,而无需在服务器上查找其生成的密钥之前是否已经在另一个客户端上生成。而这又具有以下主要优点:

  1. 由于密钥是在客户端生成的,因此也可以在客户端未连接到任何服务器时生成密钥。
  2. 由于密钥是在客户端生成的,因此无需往返服务器即可生成新密钥。这样可以大大加快这一过程。
  3. 由于密钥是在客户端生成的,因此在生成密钥的客户端之间没有竞争。每个客户端仅根据需要生成密钥。

如果这些好处对您的用例很重要,那么您应该强烈考虑是否要创建比Firestore更好的唯一ID。例如,Firestore的ID具有62 ^ 20个唯一值,这就是为什么从统计学上保证它们在很长一段时间内永远不会生成相同值的原因。您建议的0-9999999范围具有1百万个唯一值,这很可能会产生重复值。

如果您真的想要这种ID方案,则需要将已经给出的ID存储在服务器上(可能在Firestore中),以便在生成新密钥时可以对其进行检查。执行此操作的一种非常常见的方法是保留您已在文档中分发的最后一个ID的计数器。要生成新的唯一ID,您:

  1. 从文档中读取最新的计数器值。
  2. 增加计数器。
  3. 将更新的计数器值写入文档。
  4. 在代码中使用更新的计数器值。

由于此读写更新来自多个客户端,因此您将需要使用一个事务。还请注意,客户端现在正在协调密钥生成,因此您将遇到可生成密钥数量的吞吐量限制。