Firebase实时数据库orderByChild数据结构-ReactJS



我使用orderByChild查询数据时遇到问题。我想查询所有提供的用户id与任何审批者id匹配的任务。任务id是自动生成的,所以我需要以某种方式压平这个结构。每个任务有两个审批人,每个审批人都有状态、时间戳和id。

你知道如何把它压平,这样我就可以利用orderByChild了吗?

Tasks:{
"df234dgkjsf234" : {
"approvers" : {
"4U1D23dfsdf23e" : {
"id" : "4U1DWf95rJvgfAwDYs7m",
"status" : "pending",
"timestamp" : "pending"
},
"sdf32fdsf34sdg3" : {
"id" : "FXRkK22TjyxKV6z4UkrU",
"status" : "pending",
"timestamp" : "pending"
}
},
"reason" : "test",
"requester" : "4U1DWf95rJvgfAwDYs7m",
"requesterName" : "Dana Mayers",
"status" : "pending",
"tagetValue" : "QT1IkGHS3mmalyXqdCuD",
"taskName" : "Title Change",
"timestamp" : 1644773238,
"value" : "New Title"
},
"d4S34FSAdsf43FM" : {
...
}
}

我想做一个理想的查询来获得这些数据,而不是通过Approver1然后通过Approver2进行查询

Tasks:{
"df234dgkjsf234" : {
"Approver1" : "4U1DWf95rJvgfAwDYs7m",
"Approver1status" : "pending",
"Approver1timestamp" : "pending"
"Approver2" : "FXRkK22TjyxKV6z4UkrU",
"Approver2status" : "pending",
"Approver2timestamp" : "pending",
"reason" : "test",
"requester" : "4U1DWf95rJvgfAwDYs7m",
"requesterName" : "Dana Mayers",
"status" : "pending",
"tagetValue" : "QT1IkGHS3mmalyXqdCuD",
"taskName" : "Title Change",
"timestamp" : 1644773238,
"value" : "New Title"
},
"d4S34FSAdsf43FM" : {
...
}
}

没有办法用一个查询来实现这一点,因为您要查找两个单独的值。最接近的方法是对第二个数据结构(中的4Approver1Approver2(执行两个单独的查询,然后将结果合并到应用程序代码中。

另一种选择是添加一个辅助数据结构,从用户ID映射回他们允许批准的任务:

UserTasks: {
"4U1D23dfsdf23e": {
"df234dgkjsf234": true,
"d4S34FSAdsf43FM": true
},
"sdf32fdsf34sdg3": {
"df234dgkjsf234": true
}
}

有了这样的附加结构,您可以很容易地找到特定UID的任务,然后加载每个UID的任务详细信息。

关于这方面的更多信息,我建议阅读:

  • Firebase中的多对多关系
  • 如果子项的子项包含值,则进行Firebase查询
  • Firebase查询双嵌套

最新更新