firebase 如何从每个集合内的集合中获取所有数据?

xjreopfe  于 2022-11-17  发布在  其他
关注(0)|答案(3)|浏览(165)

假设我在'teacher'集合中有'teacher'集合我在Firebase中有'student'集合,我需要在列表中显示每个教师的每个学生。我知道我可以创建单独的学生集合链接教师ID,但这是我需要处理的场景。请帮助我如何使用FirebaseFirestore查询获得每个学生。

km0tfn4u

km0tfn4u1#

您正在寻找的是一个集合组查询,它允许您从具有特定名称的所有集合中读取/查询文档。
根据文档:

db
    .collectionGroup("student")
    .get()
    .then(
      (res) => print("Successfully completed"),
      onError: (e) => print("Error completing: $e"),
    );
mbskvtky

mbskvtky2#

为了达到这个目的,你需要查询所有的教师,然后在每个教师里面查询所有的学生。我已经实现了,所以我和你分享我的经验。首先,为了方便你,用json序列化制作两个模型TeacherModel和StudentModel。我已经创建了虚拟模型,你可以在模型中添加你的字段。

class TeacherModel {
  TeacherModel({
    this.students,
  });

  factory TeacherModel.fromJson(Map<String, dynamic> json) {
    /// implement from json
    return TeacherModel(students: []);
  }

  /// all the properties of teacher
  List<StudentModel>? students;

  Map<String, dynamic> toJson() => {};
}

class StudentModel {
  StudentModel();

  /// all the properties of student
  factory StudentModel.fromJson(Map<String, dynamic> json) {
    return StudentModel();
  }

  Map<String, dynamic> toJson() => {};
}

建立模型后,您有两个选项。
1-如下所示获取流中的所有数据。

static Stream<List<TeacherModel>> getStreamData() async* {
    final firestore = FirebaseFirestore.instance;
    var allTeachers = <TeacherModel>[];
    final result = firestore.collection('teachers').snapshots();
    await for (final r in result) {
      final teacherDocs = r.docs;
      for (final teacherDoc in teacherDocs) {
        final students = (await firestore
                .collection('teachers/${teacherDoc.id}/students')
                .get())
            .docs
            .map((e) => StudentModel.fromJson(e.data()))
            .toList();
        final teacher = TeacherModel.fromJson(teacherDoc.data());
        teacher.students = students;
        allTeachers.add(teacher);
        yield allTeachers;
      }
    }
  }

2-按以下方式获取未来的所有数据。

static Future<List<TeacherModel>> getFutureData() async {
    final firestore = FirebaseFirestore.instance;
    var allTeachers = <TeacherModel>[];
    final result = (await firestore.collection('teachers').get()).docs;
    for (final r in result) {
      final students =
          (await firestore.collection('teachers/${r.id}/students').get())
              .docs
              .map((e) => StudentModel.fromJson(e.data()))
              .toList();
      final teacher = TeacherModel.fromJson(r.data());
      teacher.students = students;
      allTeachers.add(teacher);
    }
    return allTeachers;
  }
f2uvfpb9

f2uvfpb93#

我在研究一个解决方案,你必须像@Sparko推荐的那样有创意。在firestore文档中他们这样说:
“Cloud Firestore服务器客户端库的listCollections()方法列出了文档引用的所有子集合。
无法使用移动的/Web客户端库检索收藏集列表。应仅在受信任的服务器环境中将查找收藏集名称作为管理任务的一部分。如果发现在移动/Web客户端库中需要此功能,请考虑重新构建数据,以便子收藏集名称可预测。”
This is also a possible work around

相关问题