使用非规范化DATA中的Firestore更新单独集合中的值

问题描述 投票:0回答:1

我有两个集合:

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是否有任何解决方案并不意味着云功能?

database firebase transactions google-cloud-firestore consistency
1个回答
1
投票

您无法对某些查询的动态结果进行原子事务处理或批处理。您必须能够在事务或批处理开始之前识别所有文档。无论您是从移动客户端还是服务器(包括云功能,也可能处理预期订单中的事件),您都会遇到此问题。

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

© www.soinside.com 2019 - 2024. All rights reserved.