如何更新Firebase文档中的字段?使用set方法修改shares字段出错如何解决
Firebase文档字段更新问题修正
你的代码存在以下几处问题:
- 误用
doc.id对象:doc.id是存储文档ID的字符串,不具备set()、data()方法,读取文档字段直接调用doc.data()即可,操作文档需要通过doc.ref获取文档引用对象 - 多余的await调用:
query()是构造查询的同步方法,不需要加await等待 - 计数操作存在并发风险:直接读取当前
shares值再加1的写法,在多请求同时操作同一份文档时会出现更新覆盖的问题,应该使用Firestore内置的increment原子操作保证计数准确 set()方法默认全量覆盖文档:如果仅需要更新shares单个字段,要么给set()方法添加{merge: true}配置避免删除其他字段,要么直接使用更适配单字段更新的update()方法
修正后的最优代码(原子增量,并发安全)
// 先引入Firestore内置的increment方法 import { increment } from "firebase/firestore"; const buyStock = async () => { const q = query( collection(db, 'myStocks'), where('ticker', '==', props.name) ); const querySnapshot = await getDocs(q); if (!querySnapshot.empty) { querySnapshot.forEach((doc) => { // 通过文档引用调用update方法,搭配原子增量操作 doc.ref.update({ shares: increment(1) }) console.log(doc, doc.id, ' => ', doc.data()); }); } }
如果你一定要使用set方法的写法
doc.ref.set({ shares: increment(1) }, { merge: true }) // merge:true表示仅覆盖指定字段,保留文档其他原有字段
内容的提问来源于stack exchange,提问作者developer
相关产品推荐
相关产品推荐

