【发布时间】: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;
}
我的查询如下:
- 根据文档,我在
update之后返回了数据,但它似乎没有按预期工作。 - 我们能否在一个事务中进行 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.db。runTransaction()是 Firestore 服务接口的一个方法,就像collection()一样。为什么有两种不同的方式来定义 Firestore?此外,我们需要知道someFunction()做了什么,以便为您提供帮助。还有什么错误吗?
标签: firebase google-cloud-platform google-cloud-firestore