database - 使用非规范化数据库中的 Firestore 更新单独集合中的值
问题描述
我有两个收藏:
Collection c1
-- doc1
-- -- name: "doc1Name"
-- -- position: 1
-- doc2
-- -- name: "doc2Name"
-- -- position: 2
Collection c2
-- doc1
-- -- name: "name1"
-- -- reference: "doc1Name"
-- -- position: 1
-- doc2
-- -- name: "name2"
-- -- reference: "doc2Name"
-- -- position: 2
-- doc3
-- -- name: "name3"
-- -- reference: "doc2Name"
-- -- position: 2
如果有人设置c1.doc2.position = 3
,我也需要更新c2.doc2.position
和c2.doc3.position
到 3 。
但是,Firestore 不允许根据给定条件更新字段,因此我需要迭代所有属于的文档c2
并position
在reference = "doc2Name"
. 如果我使用批量写入或事务,我无法C2
在它们的正文中查询,因为如果我这样做,Firestore 会返回一个错误,如“事务已经完成。”,这是由于侦听器的异步性质。而且我无法更新完成处理程序中的两个集合之一,因为如果第二个批处理/事务失败,这会使数据库不一致。
这是处理非规范化数据库时的典型场景,非规范化在处理 Firestore 时也很常见。Firestore 是否有任何不涉及云功能的解决方案?
解决方案
您不能对某些查询的动态结果进行原子处理或批处理。您必须能够在交易或批次开始之前识别所有文件。无论您是从移动客户端还是服务器(包括 Cloud Functions,它也可能处理超出您预期顺序的事件),您都会遇到此问题。
您唯一的选择可能是对两个集合的全部内容进行交易,假设它们不改变大小。如果集合可以随时更改大小,那么我认为此特定模型不适用于您的用例,因为无法锁定整个数据库以防止发生冲突更改。
推荐阅读
- python - :只有在尝试使用 to_dict 时才必须通过布尔值传递 DataFrame
- java - Try-catch 不起作用 -InputMismatchException
- c++ - 在转换序列中不允许使用定义的转换的情况
- python - 如何在 asyncio 上异步运行 `loop.run_until_complete()` 本身?
- swift - Swift AV 基金会
- octobercms - 日期格式未在 OctoberCMS 中本地化
- java - springboot 出现“无法启动 tomcat”错误,并添加了 spring-data-hadoop 依赖项
- lua - 使用 th 和 lua 命令运行 lua 脚本有什么区别?
- c# - 使用实体框架更改跟踪器进行单元测试
- python - 尝试在 python 中编写代码,将遍历 url 中的服务器名称