使用 Firestore 进行多路径更新

b-f*_*-fg 6 firebase firebase-realtime-database google-cloud-firestore

我读到的有关 Firestore 的任何地方都说它比实时 Firebase 需要更少的非规范化。我猜这是因为它是一个文档数据库,您可以在其中指向特定文档并仅检索该数量的数据(?)。

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

Mac*_*uta 4

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

\n\n

更新非规范化数据

\n\n

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

\n\n
\n

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

\n
\n\n

示例来自Firebase Firestore 文档

\n\n
// Get a new write batch\nvar batch = db.batch();\n\n// Set the value of \'NYC\'\nvar nycRef = db.collection("cities").doc("NYC");\nbatch.set(nycRef, {name: "New York City"});\n\n// Update the population of \'SF\'\nvar sfRef = db.collection("cities").doc("SF");\nbatch.update(sfRef, {"population": 1000000});\n\n// Delete the city \'LA\'\nvar laRef = db.collection("cities").doc("LA");\nbatch.delete(laRef);\n\n// Commit the batch\nbatch.commit().then(function () {\n\xc2\xa0 \xc2\xa0 // ...\n});\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n

  • 我明白了,但多路径更新的作用有所不同。它会查找数据库中的何处有非规范化数据,并更新各处的值。这与“批量”写入不同。 (3认同)