要解决“保持Firestore写入的原子性过大,超过了批量操作的限制(>500)”的问题,可以使用递归批量写入的方法。以下是一个示例代码:
const admin = require('firebase-admin');
admin.initializeApp();
const firestore = admin.firestore();
function batchWriteRecursive(collectionRef, documents, batchSize) {
if (documents.length === 0) {
return Promise.resolve();
}
const batch = firestore.batch();
const batchDocuments = documents.slice(0, batchSize);
batchDocuments.forEach((docData) => {
const docRef = collectionRef.doc();
batch.set(docRef, docData);
});
return batch.commit().then(() => {
return batchWriteRecursive(collectionRef, documents.slice(batchSize), batchSize);
});
}
const collectionRef = firestore.collection('your_collection');
const documents = [
// 假设有超过500个文档需要写入
// ... 你的文档数据
];
const batchSize = 500; // 每个批量操作的大小
batchWriteRecursive(collectionRef, documents, batchSize)
.then(() => {
console.log('批量写入完成');
})
.catch((error) => {
console.error('批量写入出错:', error);
});
在上面的示例中,我们使用递归的方式将文档批量写入到Firestore中。我们首先定义了一个batchWriteRecursive函数,它接受一个集合引用、要写入的文档数组和每个批量操作的大小作为参数。
在batchWriteRecursive函数中,我们首先检查是否已经处理完所有的文档,如果是,则返回一个已解决的Promise。否则,我们创建一个新的批量写入对象batch,然后从文档数组中取出前batchSize个文档,将它们添加到批量写入对象中。
一旦我们向批量写入对象中添加了所有文档,我们调用batch.commit()提交批量写入操作。然后,我们递归调用batchWriteRecursive函数,传入剩余的文档数组,并继续进行下一批批量写入操作。
最后,我们在主程序中调用batchWriteRecursive函数,并提供集合引用、文档数组和每个批量操作的大小作为参数。一旦批量写入完成,我们打印出一个成功的消息。如果出现错误,我们将打印出错误信息。
使用递归批量写入的方法可以解决“保持Firestore写入的原子性过大,超过了批量操作的限制(>500)”的问题,并确保数据的一致性和可靠性。