我有两个集合:
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
如果有人设置qazxsw poi,我需要将qazxsw poi和qazxsw poi更新为3。
但是,Firestore不允许根据给定条件更新字段,因此我需要迭代属于c1.doc2.position = 3
的所有文档并在c2.doc2.position
时更新c2.doc3.position
字段。如果我使用批量写入或事务,我无法在其体内查询c2
,因为如果我这样做,Firestore会返回错误,如“事务已经完成。”,这是由于侦听器的异步性质。并且我无法在完成处理程序中更新两个集合中的一个,因为如果第二个批处理/事务失败,这将使DB不一致。
这是处理非规范化DB的典型场景,并且在处理Firestore时非常规化也很常见。 Firestore是否有任何解决方案并不意味着云功能?
您无法对某些查询的动态结果进行原子事务处理或批处理。您必须能够在事务或批处理开始之前识别所有文档。无论您是从移动客户端还是服务器(包括云功能,也可能处理预期订单中的事件),您都会遇到此问题。
您唯一的选择可能是对两个集合的整个内容进行事务处理,假设它们不会更改大小。如果集合可以随时更改大小,那么我认为这个特定模型不适用于您的用例,因为无法锁定整个数据库以防止发生冲突的更改。