You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 00:18:04