是否有一种方法可以更新两个文档,每个文档都在不同的位置 收集,是否在一个请求中?
我知道您可以使用FIRWriteBatch
批量写入-对于任何文档更新,这似乎仅限于 same 集合。尝试为两个不同集合中的文档附加更新时:
// Just for example
FIRWriteBatch *batch = FIRWriteBatch.new;
[batch updateData:@{@"posts" : @1} forDocument:[self.firebase.usersCollection documentWithPath:@"some_user_id"]];
[batch setData:@{@"test" : @"cool"} forDocument:[self.firebase.postsCollection documentWithPath:@"some_post_id"]];
[batch commitWithCompletion:^(NSError * _Nullable error) {
NSLog(@"error: %@", error.localizedDescription);
}];
它永远不会执行-应用程序崩溃,我得到了:
Terminating app due to uncaught exception 'FIRInvalidArgumentException', reason:
'Provided document reference is from a different Firestore instance.'
显然,该批次不喜欢多个集合中的更新。
例如,我想避免为 usersCollection 中的文档成功设置posts = 1
,而失败则无法在 postsCollection中编写新文档。
我知道一个人写的不太可能同时另一个人写失败,但是如果确实发生,我显然不希望数据不一致。
注意:
对于任何关心的人-我都不知道它是否会失败,但是到目前为止,我正在运行事务,而无需在更新数据之前先阅读文档。 .. ♂️欢呼-1 API调用!
答案 0 :(得分:2)
您应该使用transaction,该文件在批量写入的旁边有记录:
使用Cloud Firestore客户端库,您可以将多个 将操作合并为一个交易。当您进行交易时,交易很有用 想要根据其当前值更新字段的值,或者 其他领域的价值。您可以通过创建一个计数器来增加计数器 读取计数器当前值的事务,递增 并将新值写入Cloud Firestore。
执行交易时,您不仅限于一个集合。您只需要在编写文档之前先阅读该文档:
事务包含任意数量的get()操作,后跟 任何数量的写操作,例如set(),update()或delete()。 在进行并发编辑的情况下,Cloud Firestore将运行整个 再次交易。例如,如果某笔交易读取了文档, 另一个客户端修改了这些文档中的任何一个,Cloud Firestore 重试交易。此功能可确保交易 在最新且一致的数据上运行。