我正在开发一个Flutter Restaurant应用程序,其中每个餐厅都有一个云消防商店文档,它位于一个名为queueNumber的字段中,该值从1开始,随着订单的增加,它会增加1。
我正在努力确保每个订单都有一个唯一的队列号。我有一个云功能,每当在订单集合中创建新文档时就会触发。这是以下代码。
.onCreate(async (snapshot, context) => {
const orderData = snapshot.data();
const id = orderData.id;
if (orderData && orderData.restaurantId != null) {
return restDoc.update({
queueNumber: admin.firestore.FieldValue.increment(1)
})
}
});
因此,用户使用餐厅文档中现有的queueNumber下订单。Than cloud函数增加queueNumber,因此下一个请求的queueNumber比上一个高1。
问题是:有时当两个订单一个接一个地下时,他们会得到相同的queueNumber。餐厅文件中的最终结果是正确的,但个别订单的编号错误(例如:订单1有51订单2有51餐厅文件有53(
有没有办法修复这种方法或更好的方法来处理队列号
谢谢。
您在添加文档的每个客户端之间都遇到了竞争条件。Firestore没有提供内置的方法来确保字段是唯一的,也没有提供基于其他文档的内容自动安全地设置字段值的方法。这不会像Firestore所要求的那样扩大规模。
你应该首先找到一种方法来实现你的应用程序,而不增加这样的数字。检查时间戳是否是跟踪添加文档的时间顺序的更好方法。这样做的规模会大得多。
如果你绝对需要增加这样的数字,你将不得不涉及一个全新的文档来跟踪最近分配的数字,并在添加新文档时在事务中使用该文档。交易必须:
- 阅读计数器文档
- 增加内存中的计数值
- 创建具有此值的新文档
- 同时使用此值更新计数器文档
所有这些都必须在事务中完成,否则将不安全。