在非规范化数据库中使用 Firestore 更新单独集合中的值

Update values in separate Collections with Firestore in a denormalised DB

我有两个合集:

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.positionc2.doc3.position也更新为3。

但是,Firestore 不允许根据给定条件更新字段,因此我需要迭代属于 c2 的所有文档并在 reference = "doc2Name" 时更新 position 字段。如果我使用批量写入或事务,我无法在他们的体内查询 C2,因为如果我这样做,Firestore returns 会出现类似“事务已完成.",由于侦听器的异步性质。而且我无法更新完成处理程序中的两个集合之一,因为如果第二个 batch/transaction 失败,这会使数据库不一致。

这是处理非规范化数据库的典型场景,在处理 Firestore 时,非规范化也很常见。 Firestore 是否有任何不暗示云功能的解决方案?

您不能对某些查询的动态结果进行原子处理或批处理。您必须能够在交易或批次开始之前识别所有文件。无论您是从移动客户端还是服务器(包括 Cloud Functions,它也可能会按照您的预期顺序处理事件)编写,您都会遇到这个问题。

您唯一的选择可能是对两个集合的全部内容进行交易,前提是它们的大小不变。如果集合可以随时更改大小,那么我认为这个特定模型不适用于您的用例,因为不可能锁定整个数据库以防止发生冲突更改。