firebase 为什么batchWrite最多只能写入3个数据?Firestore

06odsfpq  于 2023-02-05  发布在  其他
关注(0)|答案(1)|浏览(147)

我正在使用Firestore为我的Reactjs应用程序存储数据。我有这样一个函数:

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 };
    });
}

基本上,我希望一次添加大量数据。因此,我使用writeBatch方法。我从SO中的答案中看到,他们首先使用doc(collection(db, "product")生成一个空文档,然后使用batch.set()填充该文档。因此,我在这里执行此操作,并且一次传递多达500个数据(这是批处理写入的最大限制),但不知何故,最多只有3个数据被写入数据库。这是为什么?我错过了什么吗?

更新:

评论称:
1.当我console.log(data)时,它基本上打印出一个包含500个对象的数组(我肯定不能在这里粘贴),但我可以向您保证它正在接收正确的数据。

  1. batchAddProduct在还原传奇中被称为:
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中这样使用它:

dispatch({
    type: actions.BATCH_ADD_PRODUK,
    payload: {
        data: data, // WHICH CONTAINS UP TO 500 OBJECTS
    },
});
exdqitrt

exdqitrt1#

我还没有尝试过批量写入的生成器函数,但请尝试以下操作:

const myArray: any = []
const batches: WriteBatch[] = []
myArray.forEach((doc, i) => {
  if (i % 500 === 0) {
    batches.push(writeBatch(db))
  }

  const productRef = doc(collection(db, 'colName'))
  const batch = batches[batches.length - 1]
  batch.set(productRef, { ...data  })
})

await Promise.all(batches.map((batch) => batch.commit()))
console.log('done')

相关问题