Firebase多集合更新



有没有办法更新两个文档,每个文档都在不同的集合,在一个请求中?

我知道您可以使用FIRWriteBatch进行批量写入-这似乎仅限于任何文档更新的相同集合。当尝试为两个不同集合中的文档附加更新时:

// 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呼叫欢呼!

您应该使用一个事务,该事务记录在批写入旁边:

使用Cloud Firestore客户端库,您可以将多个操作合并到单个事务中。当您要基于字段的当前值更新字段的值,或者其他字段的值。您可以通过创建读取计数器当前值的事务,增量并将新值写入Cloud Firestore。

执行事务时,您不限于单个集合。你只需要先阅读文件,然后再写:

事务由任意数量的get((操作组成,后跟任意数量的写操作,如set((、update((或delete((。在并发编辑的情况下,Cloud Firestore运行再次交易。例如,如果事务读取文档并且另一个客户端修改任何这些文档,Cloud Firestore重试事务。此功能可确保交易基于最新且一致的数据运行。

最新更新