Firestore事务读取可能尚未创建的文档



假设在一个事务中,我会更新一些文档,但是,如果文档不存在,我会创建一个文档(即transaction.set(((。现在我的问题是,如果文档还没有创建,而其他进程调用创建了它,我能确保事务会再次被调用,这样我就不会丢失数据吗?

如果单据一直存在,很明显,如果其他流程对其进行写入,则会重新启动事务,但如果单据不存在,则事务是否会监视它,以便如果它是在执行过程中创建的,则会启动重新启动?

以下是我进行交易的方式:

await db.runTransaction(async (transaction) => {
docRef = db.collection("my_collection").doc("some_id");
const doc = await transaction.get(sDocRef);
let initial_data = {}
if (sDoc.exists)
{
initial_update = initial_update({...doc.data()}) //actually only retrieve a subset of fields
}
//Some updates on other docs
....
new_data = ....
await transaction.set(docRef, {...intial_data, ...new_data}, merge=True);
}

基于此Firebase文档:

如果文档不存在,则会创建它。如果文档确实存在,则其内容将被新提供的数据覆盖,除非您指定数据应合并到现有文档中
如果不确定文档是否存在,请传递将新数据与任何现有文档合并的选项,以避免覆盖整个文档。

此外,如果您正在使用交易,请记住以下几点:

  • 读取操作必须先于写入操作
  • 如果并发编辑影响事务读取的文档,则调用事务的函数(事务函数(可能会运行多次
  • 事务函数不应直接修改应用程序状态
  • 当客户端脱机时,事务将失败

有关使用事务更新数据和为React Native Firebase写入数据的其他信息,请访问此链接。

最新更新