使用 Firestore 进行多路径更新

Posted

技术标签:

【中文标题】使用 Firestore 进行多路径更新【英文标题】:Multi-path update with Firestore 【发布时间】:2018-05-10 00:51:30 【问题描述】:

我在所有关于 Firestore 的文章中都说它需要的非规范化比 Realtime Firebase 少。我想这是因为它是一个文档数据库,您可以在其中指向特定文档并仅检索该数量的数据(?)。

但是,我想知道如何管理非规范化仍然有用的情况(例如,我们可以通过将相同的值也存储在其他文档中来保存对包含完整信息数据的文档的查询)。如果需要更新该值,是否有类似实时 Firebase 多路径更新(更新每个文档的值)之类的方法来解决此问题?

【问题讨论】:

【参考方案1】:

我认为您想说的是“与实时数据库相比,firestore 需要更少的非规范化”(两者都是负责存储数据的 Firebase 产品)。我认为这种说法不一定正确,因为这完全取决于您的数据架构。 Firestore 强制您遵守一些好的做法,但这并不意味着您可以在实时数据库中获得类似的架构。

更新非规范化数据

您可以使用 批量写入 来更新位于不同路径的非规范化数据。但请注意,您一次最多只能更新 500 个实体。

如果您不需要读取操作集中的任何文档,则可以将多个写入操作作为一个批处理执行,其中包含 set()、update() 或 delete() 操作的任意组合。一批写入原子完成,可以写入多个文档。

来自Firebase Firestore Documentation 的示例

// Get a new write batch
var batch = db.batch();

// Set the value of 'NYC'
var nycRef = db.collection("cities").doc("NYC");
batch.set(nycRef, name: "New York City");

// Update the population of 'SF'
var sfRef = db.collection("cities").doc("SF");
batch.update(sfRef, "population": 1000000);

// Delete the city 'LA'
var laRef = db.collection("cities").doc("LA");
batch.delete(laRef);

// Commit the batch
batch.commit().then(function () 
    // ...
);

注意:代码可能不清楚,但在调用 commit 方法之前,不会在 Firestore 上执行任何写入。

【讨论】:

是的,我的意思是实时 Firebase,感谢您的澄清。 我之前也阅读过文档,但我没有看到这个示例如何显示多个文档的更新? 在此示例中,您更新了城市中的 docs SF,LA,但实际上在您调用 commit 方法时,它会一次全部发送到 Firebase 服务器,然后您只将指令(做什么)存储到 Firestore。 我明白了,但是多路径更新会有所不同。它会在数据库中找到非规范化数据的位置,并在任何地方更新值。这和batch写的不一样。

以上是关于使用 Firestore 进行多路径更新的主要内容,如果未能解决你的问题,请参考以下文章

带有子值的 Firebase 多路径原子更新?

在嵌套对象中使用firestore的FieldPath.documentId()

Flutter:使用来自 Firestore 的多集合流创建动态更新的 DataTable

为啥 Cloud Firestore 更新这么多? [复制]

Firebase实时数据库REST API是否支持不同实体位置的多路径更新?

如何做firebase多路径推送?