【问题标题】:Firebase Multiple Collection UpdateFirebase 多集合更新
【发布时间】:2018-12-11 20:09:32
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    您应该使用transaction,它记录在批处理写入旁边:

    使用 Cloud Firestore 客户端库,您可以将多个 操作到单个事务中。交易是有用的,当你 想要根据当前值更新字段的值,或者 其他字段的值。您可以通过创建一个计数器来增加一个 读取计数器当前值的事务,递增 它,并将新值写入 Cloud Firestore。

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

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

    【讨论】:

    • 我知道该事务 - 只是试图避免额外的读取请求。除非事务是单个请求项?我知道批次存在差异,它们是否计为 1 或 n 文档写入
    • 每次读取的文档都将作为文档读取计费,无论是在事务内部还是外部。就效率成本而言,没有办法让它们崩溃。批量写入总是会花费等于该批次中文档数量的写入次数。
    • 对,我是这么想的。希望不是这样,但这就是文档一直所说的。最后一个问题 - 你知道并发编辑是否也计入写入?还是仅针对在事务中读取的文档? (以防在您完成编写文档之前被另一个客户编写)
    • 我认为事务重试不会影响计费,因为写入从未真正提交。您应该查看结算页面进行确认,或者如果您需要确认,请直接联系 Firebase 支持。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 1970-01-01
    • 1970-01-01
    • 2020-07-20
    • 2015-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多