Google Firestore - 构建深层嵌套的有序数据

Sat*_*lsa 7 firebase google-cloud-firestore

我正试图弄清楚如何使用Cloud Firestore为我的运动应用程序构建数据.数据模型如下:

  • 该应用程序有许多练习
  • 每组练习都有一个有序的练习列表
  • 每个练习都有一个有序的运动部件列表
  • 每个练习部分都有一个有序的指令列表
  • 每条指令都有几个属性(例如text,imageUrl等)

我的第一个想法是简单地将数据存储在带有数字键的后续子集合中.但是,我需要能够查询一组练习中的所有数据(包括所有练习,部分和说明).由于子集合不包含在文档查询的结果中,因此将所有数据存储为后续子集合将要求我进行许多查询以检索单个练习集合的所有数据.

我还可以将上面的每一个作为单独的顶级集合存储,并保持对每个父类型的引用(例如,指令将具有setId,exerciseId和partId).然后,我可以对每个练习,部件和说明进行查询,对setId进行过滤.但是,这仍然需要多个查询,并且还需要在每个级别进行映射以重建客户端上的数据.

最后,由于我预计不需要查询练习级别,我可以将练习文档中的所有部分和说明存储在嵌套对象/数组中.这对我来说有点味道,当我试图通过Web控制台以这种方式添加几个级别的嵌套数据时,firestore引发了一个错误.

任何指导将不胜感激.

Ste*_*son 0

由于所有数据都是有序的,因此您可以创建自己的基于整数的练习 ID 并对其进行查询。该 ID 将由前导“1”然后是集合#、练习#、部分# 和指令# 构建。例子:

exerciseID: 102030101
    "text": "First, do x."
    "imageURL": "Set2Exercise3Part1Instruction1.jpg"
exerciseID: 102030102
    "text": "Second, do y."
    "imageURL": "Set2Exercise3Part1Instruction2.jpg"
exerciseID: 102030103
    "text": "Third, do z."
    "imageURL": "Set2Exercise3Part1Instruction3.jpg"
Run Code Online (Sandbox Code Playgroud)

然后,要查询第 2 组、练习第 3 部分、第 1 部分的所有说明、图片等,您将包含以下行:

exerciseAppInfo.where("exerciseID", ">=", "102030101").where("exerciseID", "<=", "102030103")
Run Code Online (Sandbox Code Playgroud)