让我们考虑以下示例:
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不太明确。它只是说:
交易记录读取了在交易记录之外修改的文档。在这种情况下,事务将自动再次运行。重试该交易次数。
答案 0 :(得分:2)
虽然我不“知道”答案,但是我可以说文档和文档在其子集合中是完全分开的-在您的user/123/subCollection/someDoc
的示例中,文档user/123
是仅用作user/123/subCollection/someDoc
的路径/索引的一部分-它们之间没有其他关系。实际上,文档user/123
可能已被删除,并且user/123/subCollection/someDoc
的路径仍然有效(在Firebase控制台中显示为斜体路径)