【问题标题】:Firestore, why use "update" instead of "set merge"?Firestore,为什么使用“更新”而不是“设置合并”?
【发布时间】:2021-01-27 05:56:54
【问题描述】:
set with merge will update fields in the document or create it if it doesn't exists

update will update fields but will fail if the document doesn't exist

总是使用集合合并不是更容易吗?

价格是否略有不同?

【问题讨论】:

    标签: google-cloud-firestore


    【解决方案1】:

    set mergeupdate 在用例上是有区别的。

    您可以在this post 上找到有关此的详细信息。

    关于定价,如here所述:

    每个设置或更新操作都算作一次写入,并根据区域计费。

    ================================================ ============================

    编辑:

    选择使用哪个操作很大程度上取决于用例,就像您使用“set merge”进行批量更新一样,您的请求将成功更新所有现有文档,但也会为不存在的 id 创建虚拟文档,这有时不是你想要的。

    在进一步调查之后,我们可以添加另一个区别:

    • set merge 将始终用您传递的数据覆盖数据,而

    • update 专门设计用于使您能够执行文档的部分更新,而不会创建您的代码未准备好处理的不完整文档。请查看this 答案,以及this 场景。

    【讨论】:

    • 谢谢阿雷忒弥斯。是的,我看过那个帖子。但我的问题是,真的没有内部差异吗?只是查询语句略有不同?如果您总是使用“设置合并”,您不必担心是否使用更新。所以它更方便,功能上没有区别。 firebase 团队为什么要进行“更新”?实在看不懂
    • 更具体地说,“set merge”还进行了某种空值检查,而“update”则不能。当“设置合并”时,如果为空,则通过覆盖防止错误。如果“设置合并”与“更新”在功能上所做的完全相同,Firebase 团队应该删除“更新”。这是因为“集合合并”的兼容性要高得多,而且价格相同。
    • 属于使用set merge进行更新的过程,如果不存在则创建一个文档。您可以将“set merge”与“update”关联到“PUT”方法与“PATCH”方法。我发现 this article 突出了这种差异。
    • 您对这些操作的映射是正确的,因为 PUT 将替换资源(类似于 set WITHOUT merge),而 PATCH 将类似于更新。因此,set with merge 介于两者之间,但是不管将操作映射到动词,set WITH merge 基本上是一个“upsert”(更新/插入),这与仅更新有本质上的不同。
    • 哇..真的吗?有一个“更新”??真的很高兴知道
    【解决方案2】:

    不同之处在于 .set(data, {merge:true}) 如果存在则更新文档,如果不存在则创建文档

    如果文档不存在,

    .update() 会失败。

    但为什么 .update() 仍然存在?好吧,可能是为了向后兼容。我相信带有 merge:true 的 .set() 是在 .update() 之后推出的。正如您所指出的,设置/合并更加通用。我用它代替 .update() 而不是 .add()

    【讨论】:

    • 谢谢老兄。曾经有一个案例,Firebase 团队没有同时创建“update”和“set merge”,但是后来又支持了set merge!但 Firebase 团队并没有因为已经在使用它的人而删除它!难道真的没有别的原因吗?我会等待更多答案,如果没有更多答案,我稍后会采用这个答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-14
    • 2015-05-30
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多