Firebase多个集合更新

时间:2018-12-11 20:09:32

标签: objective-c firebase google-cloud-firestore

  

是否有一种方法可以更新两个文档,每个文档都在不同的位置   收集,是否在一个请求中?

我知道您可以使用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调用!

1 个答案:

答案 0 :(得分:2)

您应该使用transaction,该文件在批量写入的旁边有记录:

  

使用Cloud Firestore客户端库,您可以将多个   将操作合并为一个交易。当您进行交易时,交易很有用   想要根据其当前值更新字段的值,或者   其他领域的价值。您可以通过创建一个计数器来增加计数器   读取计数器当前值的事务,递增   并将新值写入Cloud Firestore。

执行交易时,您不仅限于一个集合。您只需要在编写文档之前先阅读该文档:

  

事务包含任意数量的get()操作,后跟   任何数量的写操作,例如set(),update()或delete()。   在进行并发编辑的情况下,Cloud Firestore将运行整个   再次交易。例如,如果某笔交易读取了文档,   另一个客户端修改了这些文档中的任何一个,Cloud Firestore   重试交易。此功能可确保交易   在最新且一致的数据上运行。

相关问题