首页 > 解决方案 > 使用非规范化数据库中的 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.positionc2.doc3.position到 3 。

但是,Firestore 不允许根据给定条件更新字段,因此我需要迭代所有属于的文档c2positionreference = "doc2Name". 如果我使用批量写入或事务,我无法C2在它们的正文中查询,因为如果我这样做,Firestore 会返回一个错误,如“事务已经完成。”,这是由于侦听器的异步性质。而且我无法更新完成处理程序中的两个集合之一,因为如果第二个批处理/事务失败,这会使数据库不一致。

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

标签: databasefirebasetransactionsgoogle-cloud-firestoreconsistency

解决方案


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

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


推荐阅读