首页 > 解决方案 > 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 无法监视事务中的整个集合,而是需要传递给它的特定文档。我显然不能这样做,因为我需要监视在该集合中创建的新文档,而不是特定文档中的更改。

如果是这样,实现这一点的正确方法是什么?

标签: javascriptreactjsfirebasegoogle-cloud-firestore

解决方案


客户端应用程序的 Firestore 事务 API 要求get()您提供要参与事务的每个单独的文档。因此,如果您有一个要处理其结果的查询,您将需要:

  1. 执行查询(事务之外)
  2. 收集结果集中每个文档的文档引用
  3. 在交易中,get()他们都是单独的。

您将被限制为每笔交易 500 个文件。

如果您想动态查找要修改的新文档,您最好使用 Cloud Functions 中的Firestore 触发器在后端实现它,以便在创建每个新文档时自动处理它们,而无需客户端上的任何代码。


推荐阅读