如何在firestore集合中生成并保证独特的价值?

fis*_*tte 2 consistency firebase google-cloud-firestore

假设我们order在 firestore 中有一个集合,其中每个订单都需要有一个唯一的可读随机订单号,假设为 8 位数字:

{
    orderNumber: '19456734'
}
Run Code Online (Sandbox Code Playgroud)

因此,对于每个传入订单,我们都希望生成这个唯一的编号。firestore 中建议使用什么方法来确保没有其他文档正在使用它?

注意:一种解决方案是在保存之前查询现有文档,但这在多个订单同时到达的并发场景中不起作用(?)。

Fra*_*len 6

保证某个值在集合中唯一的最简单方法是使用该值作为该集合中文档的键/ID。由于键/ID 根据定义在其集合中是唯一的,因此这隐式地强制执行您的要求。

生成唯一 ID 的唯一内置方法是调用方法add()该方法为新文档生成 UUID。如果您不想使用 UUID 来识别您的订单,则必须推出自己的机制。

两种最常见的方法:

  1. 生成一个唯一的号码并检查它是否已被占用。当然,您可以在事务中执行此操作,以确保没有两个实例可以声明相同的 ID。

  2. 保留您所分发的最新 ID 的全局计数器(通常在众所周知位置的文档中),然后在事务中读取-增量-写入该计数器以获取任何新文档的 ID。这通常是其他数据库对其内置自动 ID 字段所做的操作。

  • 有趣的是,使用“add()”方法不会产生任何成本,而检查数字是否已存在或保留全局计数器涉及文档读取,这会产生(小)成本。 (5认同)