如何解决Firestore文档布尔值取反更新仅能从false转true的问题
Bug 根源
你写的取反逻辑完全没有拿到文档的真实字段值,问题出在取值对象上:
doc.ref是 Firestore 提供的文档操作引用,仅用于调用update、delete这类数据库操作方法,本身不承载文档的实际业务字段,从这个对象上读取自定义的completed属性,拿到的永远是undefined- 对
undefined做逻辑非运算的结果恒为true,也就是说你每次提交给数据库的更新值根本不是原字段的反值,是固定硬编码的true
这完全匹配你观测到的现象:
- 原字段初始值为
false时,固定传入true做更新,第一次切换看起来是生效的 - 原字段值已经是
true时,依然传入true做更新,和原有值完全一致,自然无法反向切回false - 因为数据库接口确实接收到了合法的更新请求,所以不管值有没有实际变化,都会返回更新成功的响应,也就会一直打出“更新成功”的日志。
代码修正
文档的真实字段值都存在doc.data()返回的对象中,只需要把取反的数据源替换成这个对象即可,修正后的update逻辑:
doc.ref.update({ completed: !doc.data().completed }).then(() => { console.log('completion stat update has been successful'); }).catch(err => { console.log('Error updating completition status: ', err); });
注意事项
上述“先读取当前值、再回写更新”的流程,在多端并发修改同一条文档时存在竞态风险:如果两个客户端同时读到同一个旧值,先后发起更新就会互相覆盖对方的修改。如果是高并发的使用场景,可以直接在数据库端用原子操作完成字段取反,不需要在客户端完成读+写的两次往返。
内容的提问来源于stack exchange,提问作者Simon Suh
相关产品推荐
相关产品推荐

