对于我的项目,我需要可以轻松共享的 ID,因此 firestores 默认自动生成的 ID 将不起作用。
我正在寻找一种自动生成 id 的方法,8329423它会在 0 到 9999999 的范围内递增或随机选择。
如何为 Firestore 中的文档制作自定义自动生成的 ID
IT技术
reactjs
firebase
google-cloud-firestore
2021-05-10 22:36:12
1个回答
Firestore 的自动 ID 字段旨在从统计上保证不会有两个客户端生成相同的值。这就是为什么它们如此之长:这是为了确保它们具有足够的随机性(熵)。
这允许 Firestore 完全在客户端确定这些密钥,而无需在服务器上查找它生成的密钥之前是否已经在另一个客户端上生成。这反过来又具有以下主要好处:
- 由于密钥是在客户端生成的,因此它们也可以在客户端未连接到任何服务器时生成。
- 由于密钥是在客户端生成的,因此不需要往返服务器来生成新密钥。这大大加快了这个过程。
- 由于密钥是在客户端生成的,因此生成密钥的客户端之间不存在争用。每个客户端只根据需要生成密钥。
如果这些好处对您的用例很重要,那么您应该认真考虑是否有可能创建比 Firestore 更好的唯一 ID。例如,Firestore 的 ID 有 62^20 个唯一值,这就是为什么它们在统计上保证不会在很长一段时间内生成相同的值。您建议的 0 - 9999999 范围有 100 万个唯一值,这更有可能产生重复值。
如果您真的想要这种 ID 方案,则需要将您已经提供的 ID 存储在服务器上(可能在 Firestore 中),以便您可以在生成新密钥时对其进行检查。执行此操作的一种非常常见的方法是保留您已在文档中分发的最后一个 ID 的计数器。要生成新的唯一 ID,您需要:
- 从文档中读取最新的计数器值。
- 增加计数器。
- 将更新的计数器值写入文档。
- 在您的代码中使用更新的计数器值。
由于此读取-更新-写入发生在多个客户端,因此您需要为其使用事务。另请注意,客户端现在正在协调密钥生成,因此您将遇到可以生成的密钥数量的吞吐量限制。