我具有以下 Cloud Function ,并想知道我应该使用批量写入还是事务:
const firestore = admin.firestore()
// The following two queries potentially return hundreds of documents.
const queryA = firestore.collectionGroup('a').where('b', '==', 'c'),
queryB = firestore.collection('b').where('b', '==', 'c')
const snapshotA = await queryA.get(), snapshotB = await queryB.get()
const batch = firestore.batch()
for (const documentSnapshot of snapshotA.docs.concat(snapshotB.docs)) {
batch.update(documentSnapshot.ref, { 'b': 'd' })
}
return batch.commit()
我确实要求此操作必须永不失败,但是,我看不到任何这种操作都会失败的情况。
在这种情况下,是否有任何理由使用交易?
相反,是否有任何理由不使用此处的交易?
答案 0 :(得分:1)
您只需写到Firestore(而不是读取),因此乍一看,无需使用事务,因为“当您想更新字段的值时,事务很有用根据其当前值或其他字段的值”(请参见doc),则应使用批量写入。
但是,您应该注意“每笔交易或批量写入最多可以写入500个文档”(请参阅同一文档)。由于您提到查询“可能返回数百个文档”,因此您在这里可能会遇到问题,必须分几批编写。
其他要点:您说:“我确实要求此操作必须永不失败,但是我看不到任何可能会失败的情况”。您无法确定它会 永远不会 失败:如文档中所述,Cloud Function“可能由于内部错误而过早退出”(有关更多详细信息,请参见以下要点) )。例如,Cloud Function平台和Firestore 1之间可能存在连接问题,并且批量写入失败(与代码无关)。
要满足此要求(即“我确实要求此操作永不失败”),您应该利用重试后台Cloud Function 的可能性以及批处理的事实的写入原子完成。有关后台云功能重试的信息,请参阅以下doc,它说明: