如何在Firebase中按条件更新字段,能否通过单次操作实现
Firestore 带条件递减字段值的实现方案
你可以通过单次原子操作完成需求,不需要先查询数据再执行更新,也不会有并发冲突问题。
你当前的写法是错误的:在update参数内写的JS逻辑是在本地执行的,不会到服务端做条件校验,只要本地判断firebase.firestore.FieldValue !== ""成立,不管服务端的实际数据情况,都会执行递减操作,满足不了你的需求。
正确的实现方式是使用Firestore的条件更新能力,在更新前链式调用where方法设置服务端校验规则,只有满足规则的文档才会执行更新操作,示例代码如下:
return db .collection("users") .doc(userId) // 此处替换为你实际需要的判断条件,示例为仅当daysLeft大于0时才执行更新 .where("daysLeft", ">", 0) .update({ daysLeft: firebase.firestore.FieldValue.increment(-1) });
额外说明
- 整个操作全程只发起一次服务端请求,条件校验和更新都是服务端原子执行,不会出现并发导致的数据不一致问题
- 如果条件不满足,请求会抛出对应错误,你可以捕获错误后做自定义处理
- 多条件场景可以链式追加多个
where方法,服务端会同时校验所有条件均成立才执行更新
内容的提问来源于stack exchange,提问作者handsome
相关产品推荐
相关产品推荐

