javascript - Firestore JS - 在事务中递增
问题描述
我有一些如下所示的代码:
export const createTable = async (data) => {
const doc = db.collection("tables").doc();
const ref = db
.collection("tables")
.where("userId", "==", data.userId)
.orderBy("number", "desc").limit(1);
db.runTransaction(async transaction => {
const query = await transaction.get(ref);
let number = 1;
if (!query.empty) {
const snapshot = query.docs[0];
const data = snapshot.data();
const id = snapshot.id;
number = data.number + 1;
}
data = {number, ...data};
transaction.set(doc, data);
});
基本上我有一个表格集合,每个表格都有一个自动生成的数字,如#1、#2、#3
创建新表时,我想获取最新的表号并创建新表,该表号加 1。
我想将它包装在一个事务中,这样如果在运行事务时创建了一个表,它将重新启动,这样我就不会得到重复的数字。
但是,.get() 上出现了这个错误,并且从谷歌搜索中我读到 Firestore 无法监视事务中的整个集合,而是需要传递给它的特定文档。我显然不能这样做,因为我需要监视在该集合中创建的新文档,而不是特定文档中的更改。
如果是这样,实现这一点的正确方法是什么?
解决方案
客户端应用程序的 Firestore 事务 API 要求get()
您提供要参与事务的每个单独的文档。因此,如果您有一个要处理其结果的查询,您将需要:
- 执行查询(事务之外)
- 收集结果集中每个文档的文档引用
- 在交易中,
get()
他们都是单独的。
您将被限制为每笔交易 500 个文件。
如果您想动态查找要修改的新文档,您最好使用 Cloud Functions 中的Firestore 触发器在后端实现它,以便在创建每个新文档时自动处理它们,而无需客户端上的任何代码。
推荐阅读
- python - Pipenv:指定 setuptools 的版本
- android - 如何将整数文字放入 Room 查询?
- ios - StatusBar 呈现触发布局循环
- python - 如何在多处理的单独进程中更新共享变量?
- ag-grid - 在小网格中,工具面板菜单被剪裁
- node.js - 无法在全球范围内安装最新版本的 Yeoman 和适用于 Office 加载项的 Yeoman 生成器
- javascript - 使用 this.str 时变量未定义
- linux - 如何控制 /etc/hosts 文件不被覆盖
- ios - 为某些项目处理情节提要时 Xcode 挂起
- c# - 使用枚举和 | 作为字典键