Firestore:运行具有多个检索的复杂更新查询(ReactJS)

时间:2018-11-13 23:19:19

标签: reactjs firebase optimization google-cloud-firestore

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

|花费总计:150美元|

|项目1:80美元|

|项目2:70美元|

因此,所有这些费用(70,80和150)的值存储在我的Firestore数据库中,其中的子项是与我的总支出分开的集合。现在,我希望能够更新商品2的价格,例如说90美元,这将更新Firestore中商品2的价值,但是我希望此商品能够对表格进行检查,以便“花费总计”也更新为说“ $ 170”。完成这样的事情的最佳方法是什么?

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

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

编辑:以下是一些有关我当前如何设置Firestore布局的图片:enter image description here enter image description here enter image description here

1 个答案:

答案 0 :(得分:1)

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

尝试以下视频:https://youtu.be/v_hR4K4auoQ 而这个:https://youtu.be/haMOUb3KVSo

但是,是的,您可以使用云函数为您更新一个值,或者您可以在应用逻辑中进行新的“支出总计”计算,并且当您为第2项写入新值时,还要为“支出”写入新值总。

但是,大多数情况下,您需要了解Firestore如何存储数据以及如何收取数据费用。您大部分是为每个读/写请求付费,而不必担心总体上实际存储的数据量。因此,如果始终要同时使用它们,最好不要将这些值保存在单独的集合中。

例如:

Collection(transactions)=> Document(transaction133453){item1:$ 80,item2:$ 70,花费总计:$ 150}

,然后如果您需要更新该事务,则只需一次更新该文档的值,它将仅计为1次写入操作。您可以将交易集合存储为客户文档的子集合,也可以简单地存储为其自己的集合。但最重要的是,对于具有表,列和行的SQL数据库,您依赖的大多数最佳实践与Firestore(NoSQL)数据库无关,因此100%都必须先全面了解其含义。开始计划数据库的结构。

我希望这会有所帮助!!快乐的油管...

根据评论进行编辑:
我想考虑的方式是我如何使用数据,而不是最合理的组织数据方法。我不确定我是否理解您的示例数据的上下文,但是如果我可能正在跟踪项目的预算或其他预算,则可以使用下面粘贴的屏幕快照之类的东西。

由于每个预算的团队成员数量可能非常有限,因此可以将其与预算专用的所有字段一起存储在文档中的数组中,基本上是我可能想要的任何内容例如,在显示预算明细的屏幕中显示。因为当您查询以填充该屏幕的数据时,如果所需的全部都在一个文档中,那么您只需要发出一个请求即可!但是,如果您将“标题”保留在一个文档中,然后将“数据”保留在另一个文档中,那么现在您只需要填充两个屏幕就可以发出2个请求。

然后也许在该屏幕上,我有一个“查看相关交易”的链接,如果用户单击该链接,则您将对您的交易集合进行查询。最好将交易存储在集合中,因为您可能不知道要进行5笔交易还是500笔交易。如果您想在预算明细页上显示交易总数,可以考虑添加一个预算文档中的“ totalTransactions :(数字)”字段。然后,每次用户添加事务时,您都将事务详细信息写入适当的事务集合中,并且还将totalTransactions字段增加1-这将是对数据库的2次写入。 Firestore基于以下概念构建:用户可能比写入数据更频繁地读取数据。因此,在更新交易记录时要写两次,但每次查看预算并想知道发生了多少笔交易时,都只需要阅读一份文档即可。

与聊天功能相同。但是,如果您只想一次仅显示一个预算的聊天记录,则只会将其作为预算文档的子集合。如果您希望所有聊天都在一个屏幕上进行,以讨论所有预算,那么您可能希望在根级别进行聊天。

关于从文档中获取数据,它基本上是一个JSON对象,因此(可能会略有不同,具体取决于您所使用的应用程序类型),
嵌套数组由

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

嵌套对象:

documentName.objectName.fieldName
budget12345.projectManager.firstName

然后是一个子集合

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

FirebaseExample budget doc

FirebaseExample remainder of budget doc

FirebaseExample team chats collection

FirebaseExample transactions collection