现在有了“包含数组”查询,可以对Firestore进行多对多建模

时间:2019-05-31 14:05:55

标签: javascript firebase google-cloud-firestore many-to-many

请参阅此处的https://medium.com/@alfianlosari/firebase-realtime-database-many-to-many-relationship-schema-4155d9647f0f,对于多对多关系,推荐的方法是创建两个集合,并在更新数据时不断使它们保持同步。由于引入array-contains时查询数据的可能性已经略有变化,所以我想知道现在将这样的关系保留在单个集合中是否更有意义,如果您想获取特定的类,则可以查询一个特定的类注册学生或通过创建查询来查找学生的所有班级,例如:

class_students.where('students_enrolled', 'array-contains', 'student1')

class_students:
  class1:
    students_enrolled: [student1, student2, student3]
  class2:
    students_enrolled: [student1]

现在推荐什么方法,或者在查询数据时既可行又有效?其他利弊,例如您可以查询的无用数据量(例如数组中的其他学生)?

1 个答案:

答案 0 :(得分:0)

创建Cloud Firestore数据库架构时,需要根据要执行的查询创建它。因此有no "perfect", "the best" or "the correct" solution for structuring a Cloud Firestore database。就您而言,您有两个查询:

  • 如果要招收已注册的学生,请查询特定班级
  • 寻找学生的所有课程

因此,您可以使用以下可能的解决方案简单地获得这些结果:

Firestore-root
    |
    --- classes (collection)
    |     |
    |     --- classId (document)
    |          |
    |          --- //class properties
    |          |
    |          --- enrolledStudents: [studentIdOne, studentIdTwo]
    |
    --- students (collection)
          |
          --- studentId (document)
               |
               --- //student properties

要使所有用户都属于一个班级,请首先获取enrolledStudents数组中存在的所有学生ID,然后根据这些ID获取学生对象。

要获得学生的所有班级,您是对的,只需使用array-contains过滤器。需要注意的一件事是,如果您尝试添加enrolledStudents数组,而不是字符串类型为Student对象的学生ID,请注意,您无法从Firestore返回学生对象的列表,为此自己编写代码。

我还建议您从以下帖子的答案中阅读有关此主题的更多详细信息: