Firestore批量写入仅成功3条数据?求助排查原因
问题:Firestore批量写入仅成功少量数据的原因排查
我在React应用中使用Firestore存储数据,编写了batchAddProduct函数用于批量添加商品数据,代码如下:
export async function batchAddProduct(data) { const productRef = doc(collection(db, "product")); const batch = writeBatch(db); for (const datum of data) { batch.set(productRef, datum); } return await batch .commit() .then(() => { return { data: true, error: null }; }) .catch((err) => { return { data: null, error: err }; }); }
我希望一次性批量添加最多500条数据(Firestore批量写入的上限),但数据库中仅写入了最多3条数据,请问哪里操作有误?
更新信息
- console.log(data)显示传入的是包含500个对象的数组,数据无误
batchAddProduct在Redux Saga中调用,相关代码如下:
Saga调用逻辑:
触发调用的dispatch代码:function* BATCH_ADD_PRODUCT(input) { yield put({ type: actions.SET_STATE, payload: { loadingUpdate: true, }, }); const { data, error } = yield call(batchAddProduct, input.payload.data); if (data) { yield put({ type: actions.GET_PRODUK, }); yield put({ type: actions.SET_STATE, payload: { loadingUpdate: false, alert: { type: "success", message: "Product is added successfully.", }, }, }); } if (error) { console.log(error); yield put({ type: actions.SET_STATE, payload: { loadingUpdate: false, alert: { type: "error", message: error.message || "Error occured.", }, }, }); } }dispatch({ type: actions.BATCH_ADD_PRODUK, payload: { data: data, // 包含最多500个对象的数组 }, });
问题原因及修复方案
核心错误
你将productRef的创建逻辑放在了循环外部,导致所有批量写入操作都指向同一个文档引用。每次执行batch.set(productRef, datum)都会覆盖该文档的内容,最终数据库中只会保留最后一次写入的数据(你看到3条是测试时的偶然情况,本质是重复覆盖)。
修复代码
需要在循环内部为每个数据生成新的文档引用,确保每个set操作对应独立的文档:
export async function batchAddProduct(data) { const batch = writeBatch(db); const productCollection = collection(db, "product"); for (const datum of data) { // 每次循环生成新的文档引用(带随机ID) const productRef = doc(productCollection); batch.set(productRef, datum); } try { await batch.commit(); return { data: true, error: null }; } catch (err) { return { data: null, error: err }; } }
补充说明
- Firestore的
doc(collectionRef)方法每次调用都会生成一个带有随机唯一ID的新文档引用,确保每个数据对应独立的文档 - 保持批量操作的500条上限,如果待写入数据超过500条,需要拆分多个批次依次执行
内容的提问来源于stack exchange,提问作者Owenn
相关产品推荐
相关产品推荐

