【发布时间】:2019-04-24 12:13:08
【问题描述】:
我有两个收藏:
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 的所有文档,并在 reference = "doc2Name" 时更新 position 字段。如果我使用批量写入或事务,我无法在他们的正文中查询C2,因为如果我这样做,Firestore 会返回类似“事务已经完成。”的错误,因为侦听器的异步性质。而且我无法更新完成处理程序中的两个集合之一,因为如果第二个批处理/事务失败,这会使数据库不一致。
这是处理非规范化数据库时的典型场景,非规范化在处理 Firestore 时也很常见。 Firestore 有没有不涉及云功能的解决方案?
【问题讨论】:
-
批量写入前不能查询吗? (仅供参考,Firestore 的名称中没有大写的 S。)
-
您的意思是保存所有要编辑的文档的引用的查询?如果是这样的话,我可以,但是如果在延迟期间集合的内容发生变化,我仍然会出现不一致(我编辑了大写的 S)。
标签: database firebase transactions google-cloud-firestore consistency