如何将数组数据更新到Firebase并实现对应文档ordered字段自增1
问题解决说明
核心错误原因
data1/data2/data3都是存储多个图书对象的数组,不是单个对象,直接写data1.id自然会返回undefined,必须遍历数组逐个获取每本图书的id- 你原本写的
++1更新写法不符合Firestore的规范,且没有原子性,高并发场景下会出现计数错误,应该用Firestore官方提供的原子递增操作符
实现逻辑说明
因为你已经直接拿到了对应文档的唯一id,完全不需要用where做额外查询,直接通过集合.doc(文档id)就能精准定位到要更新的文档,执行更新操作即可,你最终写的代码逻辑是正确的。
代码优化建议
你可以把重复的逻辑抽成公共函数,同时添加Promise等待逻辑,保证所有更新操作完成后再跳转页面,避免出现更新丢失:
// 封装公共更新函数 const updateOrderedCount = (collectionName, items) => { const increment = firebase.firestore.FieldValue.increment(1); const collectionRef = db.collection(collectionName); // 生成所有更新操作的Promise数组 const updatePromises = items.map(item => { return collectionRef.doc(item.id).update({ ordenado: increment }) }) return Promise.all(updatePromises) } // 原有订单写入逻辑调整 const docRef = db.collection('usuarios').doc(user.uid).collection('pedidos').doc(docId) docRef.set({ acudiente: user.displayName, email: user.email, phone: phone, nombre: nombre, grado: grado, total: totalPrice, totalPagado: 0, escuela: escuela, metodoDePago: "ACH", banco: "Global Bank", estadoDePago: "Pendiente", fecha: formattedDate, id: docId, data: allItems }).then(() => { // 同时执行三个集合的更新 return Promise.all([ updateOrderedCount('libros', data1), updateOrderedCount('libros_Opcionales', data2), updateOrderedCount('productos_AIB', data3) ]) }).then(() => { // 所有操作完成后再跳转 history.push("/Inicio"); }).catch(err => { // 可以在这里添加错误处理逻辑,比如提示用户操作失败 console.error('操作失败:', err) })
内容的提问来源于stack exchange,提问作者React Enjoyer
相关产品推荐
相关产品推荐

