首页 > 解决方案 > Firestore:运行具有多个检索的复杂更新查询 (ReactJS)

问题描述

我有一个数据网格,其端点显示在我的 firestore 数据库中存储的数据中。例如,大纲可能如下:

| 总花费:$150 |

| 项目 1:80 美元 |

| 第 2 项:70 美元 |

因此,所有这些成本(70,80 和 150)的值都存储在我的 firestore 数据库中,子项目是我总支出的单独集合。现在,我希望能够将第 2 项的价格更新为 90 美元,这将更新第 2 项在 Firestore 中的价值,但我希望它随后对表进行检查,以便“总花费”也更新为说“170 美元”。完成这样的事情的最佳方法是什么?

特别是如果我要添加多个相互依赖的行和列,那么更新网格的一部分的最佳方法是什么,以便网格上的所有数据端点都正确更新?我应该以某种方式使用云功能吗?

此外,我正在创建一个 ReactJS 应用程序,之前在该应用程序中,我只是将我的网格端点存储在我的 Redux 存储状态中,以便我可以运行检查每一行和每一列并进行一些数学运算以正确更新每个端点的复杂方法,但是什么既然我已将数据迁移到 Firestore,那么执行此操作的最佳方法是什么?

编辑:这里有一些我正在尝试设置我的firestore布局的图片:在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

标签: reactjsfirebaseoptimizationgoogle-cloud-firestore

解决方案


您可能需要稍微备份一下,以便更好地了解 Firestore 的数据库类型。它是 NoSQL,因此不存在行、列和表之类的东西。

试试这个视频:https ://youtu.be/v_hR4K4auoQ 和这个:https ://youtu.be/haMOUb3KVSo

但是,是的,您可以使用云函数为您更新一个值,或者您可以在您的应用程序逻辑中进行新的 Spent total 计算,当您为 Item 2 写入新值时,也为 Spent total 写入新值。

但大多数情况下,您需要了解 Firestore 如何存储您的数据以及它如何向您收取检索数据的费用。您主要为每个读/写请求付费,而对您总体存储的实际数据量的关注要少得多。因此,如果您总是要同时使用它们,最好不要将这些值保存在单独的集合中。

例如:

收藏(交易)=> 文档(交易 133453){项目 1:80 美元,项目 2:70 美元,花费总计:150 美元}

然后,如果您需要更新该事务,您只需一次更新该文档的所有值,它只会算作 1 次写入操作。您可以将交易集合存储为客户文档的子集合,或者简单地存储为它自己的集合。但最重要的是,对于具有表、列和行的 SQL 数据库,您所依赖的大多数最佳实践与 Firestore (NoSQL) 数据库 100% 无关,因此您必须充分了解这意味着什么开始规划数据库的结构。

我希望这有帮助!!快乐的YouTube...

编辑以回应评论:
我喜欢思考它的方式是我将如何使用数据,而不是组织数据的最合乎逻辑的方式。我不确定我是否理解您的示例数据的上下文,但如果我可能正在跟踪项目的预算或其他内容,我可能会使用类似于我在下面粘贴的屏幕截图的内容。

由于每个预算的团队成员数量可能非常有限,因此可以将其存储在文档中的数组中,以及特定于该预算的所有字段 - 基本上是我想在例如,显示预算详细信息的屏幕。因为当您进行查询以填充该屏幕的数据时,如果您需要的所有内容都在一个文档中,那么您只需提出一个请求!但是,如果您将“标题”保存在一个文档中,然后将“数据”保存在另一个文档中,那么现在您必须发出 2 个请求才能填充 1 个屏幕。

然后也许在那个屏幕上,我有一个指向“查看相关交易”的链接,如果用户点击它,你就会调用一个对你的交易集合的查询。像交易这样的东西最好存储在一个集合中,因为您可能不知道您将有 5 笔交易还是 500 笔交易。如果您想在预算详细信息页面上显示您有多少总交易,您可以考虑添加预算文档中“totalTransactions: (number)”的字段。然后每次用户添加事务时,您会将事务详细信息写入适当的事务集合,并将 totalTransactions 字段增加 1 - 这将是 2 次写入您的数据库。Firestore 是围绕用户可能阅读的概念构建的数据方式比写入数据更频繁。因此,当您更新交易时进行两次写入,但每次查看预算并想知道发生了多少交易时只需阅读一个文档。

对于聊天之类的东西也是如此。但是,如果您只想一次只显示一个预算的聊天,您只会将聊天作为预算文档的子集。如果您希望所有聊天都在一个屏幕上进行以讨论所有预算,您可能希望将聊天集合放在根级别。

至于从文档中获取数据,它基本上是一个 JSON 对象,因此(可能会根据您使用的应用程序类型而略有不同),
嵌套数组由以下内容引用:

documentName.arrayName[index]
budget12345.teamMembers[1]  

嵌套对象:

documentName.objectName.fieldName
budget12345.projectManager.firstName

然后是一个子集合

collection(budgets).document(budget12345).subcollection(transactions)

FirebaseExample 预算文档

FirebaseExample 预算文档的剩余部分

FirebaseExample 团队聊天集合

FirebaseExample 交易集合


推荐阅读