Firestore批量循环写入仅创建最后一条奖品文档问题
问题分析与解决方案
嘿,我一眼就看穿问题出在哪了!你当前代码的核心问题是把奖品文档引用prizeRef的定义放在了循环外面,导致整个循环过程中一直在复用同一个文档引用——每次调用batch.set(prizeRef, ...)都是在覆盖同一个文档,自然最后只会留下最后一次写入的结果,前面的循环操作全白做了。
修复后的代码示例
你需要把doc()的调用移到循环内部,这样每次循环都会生成一个全新的、唯一的文档引用,确保每个奖品都对应独立的文档:
// 一等奖循环:把doc()移到循环内 for(let i=0; i<Number(prizeData[0].amount); i++){ console.log(prizeData[0].amount); // 每次循环生成新的文档引用 let prizeRef = db.collection("events").doc(eventRef.id).collection("prizes").doc(); batch.set(prizeRef, { ticketID: "", uid: "", name: "", item: prizeData[0].item, type: prizeData[0].type, redeem: false, redeemTime: null }); } // 二等奖循环同理 for(let i=0; i<Number(prizeData[1].amount); i++){ let prizeRef = db.collection("events").doc(eventRef.id).collection("prizes").doc(); batch.set(prizeRef, { ticketID: "", uid: "", name: "", item: prizeData[1].item, type: prizeData[1].type, redeem: false, redeemTime: null }); } // 三等奖、安慰奖的循环也按照这个逻辑修改
原理说明
Firebase Firestore的doc()方法如果不传入自定义ID,会自动生成一个随机的唯一文档ID。当你把doc()放在循环外面时,只会生成一次这个ID,所有循环操作都指向同一个文档;移到循环内部后,每次迭代都会生成新的ID,也就对应新的文档了。
这样修改后,不管是一等奖的N个名额,还是安慰奖的10个名额,都会各自创建对应的独立文档,不会再出现覆盖的问题啦!
内容的提问来源于stack exchange,提问作者user6468030
相关产品推荐
相关产品推荐

