如果修改了子集合中的文档,交易会失败吗?

时间:2020-09-15 20:46:01

标签: google-cloud-firestore transactions

让我们考虑以下示例:

import { firestore } from 'firebase-admin';

const userCollectionRef = firestore().collection('users');

const setUserData = (userId, data) => {
  return firestore().runTransaction(async trx => {
    const userDocRef = userCollectionRef.doc(userId);
    return trx.set(userDocRef, data);
  });
};

const doSomethingElse = (userId, doc, data) => {
  return userCollectionRef
    .doc(userId)
    .collection('subCollection')
    .doc(doc)
    .set(data);
};

如果我调用setUserData(123, someData);并且在执行此功能时,会调用doSomethingElse(123, 'someDoc', someOtherData)函数-事务会因为子集合中的文档被修改而失败吗?

基于文档,我假设仅在user/123调用进行过程中修改setUserData文档但对{{1}进行修改时,交易会失败}文档不会导致交易失败。不过我不确定,因为the transaction failure docs section不太明确。它只是说:

交易记录读取了在交易记录之外修改的文档。在这种情况下,事务将自动再次运行。重试该交易次数。

1 个答案:

答案 0 :(得分:2)

虽然我不“知道”答案,但是我可以说文档和文档在其子集合中是完全分开的-在您的user/123/subCollection/someDoc的示例中,文档user/123用作user/123/subCollection/someDoc的路径/索引的一部分-它们之间没有其他关系。实际上,文档user/123可能已被删除,并且user/123/subCollection/someDoc的路径仍然有效(在Firebase控制台中显示为斜体路径)