【问题标题】:2 updates within one Firestore transaction一次 Firestore 事务中的 2 次更新
【发布时间】:2021-09-06 06:01:30
【问题描述】:

我是 Firestore 事务的新手,想根据文档的当前数据更新文档字段。

我的计划交易如下:

const cityRef = db.collection('cities').doc('SF');
try {
    await db.runTransaction(async (t) => {
        const doc = await t.get(cityRef);
        let status = doc.data().myStatus;

        if (status == "one") {
            throw "err";
        } else {

            // run some function - next status is based on the return             
            let output = await someFunction();

            if (output) {
                await t.update(cityRef, { myStatus: "two" });
                return output;
            } else {
                await t.update(cityRef, { myStatus: "three" });
                return output;
            }
        }
    });
    console.log("transaction successful");

} catch (err) {
    console.log("Alreadu updated");
    output = "one";
    return output;
}

我的查询如下:

  1. 根据文档,我在update 之后返回了数据,但它似乎没有按预期工作。
  2. 我们能否在一个事务中进行 2 次更新(两者都在更新 firestore 中的同一字段)?

谢谢

【问题讨论】:

  • “它似乎没有按预期工作”是什么意思。你能分享一下输出的sn-p吗?另外,为什么在两种情况下都更新为相同的值 myStatus: two?
  • 为什么你一方面使用db.collection('cities').doc('SF');,另一方面使用app.db.runTransaction?什么是app,你应该做db.runTransaction?另外,someFunction() 是什么?它是否在事务之外处理/读取文档?这行不通。
  • @RenaudTarnec 抱歉,我已经更新了这个问题。 db.collection('cities').doc('SF'); 应该在事务之外。
  • @Hydra 我刚刚更新了这个问题。根据someFunction() 的输出,我需要设置myStatus 的值。 myStatus 最初设置为one,如果someFunction() 返回true,那么我们将myStatus 设置为two,否则设置为three
  • @KK2491 我还是不明白你为什么在db.collection('cities').doc('SF'); 中使用db,在app.db.runTransaction 中使用app.dbrunTransaction() 是 Firestore 服务接口的一个方法,就像 collection() 一样。为什么有两种不同的方式来定义 Firestore?此外,我们需要知道someFunction() 做了什么,以便为您提供帮助。还有什么错误吗?

标签: firebase google-cloud-platform google-cloud-firestore


【解决方案1】:

您在上面的 cmets 中做了以下说明:

someFunction() 在其他 Firestore 上进行一些处理 集合/文档(不是我要更新的)并返回 真假。

正如您在 Transactions 文档中所读到的,“读操作必须在写操作之前”。如果你想阅读事务中的一些文档,你需要使用事务的get() 方法,就像你对第一个文档所做的那样。您不能调用使用其他 Firestore 方法的函数,例如 DocumentReferenceget() 方法。

【讨论】:

  • 感谢您的澄清。如果我理解正确,我不能调用在同一个文档字段上修改/使用 Firestore 方法的函数。在我的情况下,someFunction() 确实具有 get() Firestore 功能,但是它不在事务中正在更新的同一个文档上。
  • 您需要在交易中包含这些文档。
  • 感谢您的澄清。我想我误解了文档,我认为我们可以使用t.update() 函数对未在事务中更新的文档/集合执行正常的get() 操作。
猜你喜欢
  • 2021-04-22
  • 1970-01-01
  • 2013-09-29
  • 1970-01-01
  • 1970-01-01
  • 2021-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多