如何在Firestore更新字段前将原有值备份到指定字段
实现方案
你需要使用Firestore的事务操作来实现这个原子更新:先读取文档当前的value值,再同步将旧值写入last字段、新汇率写入value字段,全程是原子操作,不会出现数据不一致的问题。
代码实现
const usdRateDoc = db.collection("currencies").doc('USD'); db.runTransaction(async (transaction) => { // 第一步:读取当前文档最新数据 const docSnapshot = await transaction.get(usdRateDoc); if (!docSnapshot.exists) { throw new Error("USD汇率文档不存在"); } // 取出旧的value值 const oldValue = docSnapshot.data().value; // 第二步:原子写入两个字段:旧value存到last,新汇率存到value transaction.update(usdRateDoc, { last: oldValue, value: newRates['USD'] }); }).then(() => { console.log("汇率更新成功,历史值已备份"); }).catch((error) => { console.log("更新失败:", error); });
说明
- 事务操作会保证整个读-写流程的原子性:如果过程中该文档被其他请求修改,事务会自动重试,确保写入的
last值一定是更新前的value原值 - 如果你确定不会有并发写入汇率的场景,也可以先普通读文档再调用
update方法,但事务是更稳妥的方案,避免出现数据错乱 - 原来的
set方法如果不传第二个参数{merge: true}会直接覆盖整个文档,所以如果要单独更新字段更建议用update方法
内容的提问来源于stack exchange,提问作者E. Williams
相关产品推荐
相关产品推荐

