Dart Firestore-从现有集合创建新的子集合

Dart Firestore-从现有集合创建新的子集合,dart,google-cloud-firestore,Dart,Google Cloud Firestore,我的应用程序提供了基于州/位置查询高尔夫球场的功能——由于数据模型,我需要从Firestore中的两个不同集合中提取数据。目前,集合(“golfclub”包含位置信息和“courses”,其中包含我需要检索的课程名称) 这两个集合共享一个公共字段(“设施ID”),并具有多对一(courses->golfclub)关系。每个高尔夫俱乐部可能有一个或多个相关球场 如何创建一个子集合(clubcourses),根据匹配的设施ID将现有课程集合中的每个文档附加到golfclub集合中的相应文档 我的最终

我的应用程序提供了基于州/位置查询高尔夫球场的功能——由于数据模型,我需要从Firestore中的两个不同集合中提取数据。目前,集合(“golfclub”包含位置信息和“courses”,其中包含我需要检索的课程名称)

这两个集合共享一个公共字段(“设施ID”),并具有多对一(courses->golfclub)关系。每个高尔夫俱乐部可能有一个或多个相关球场

如何创建一个子集合(clubcourses),根据匹配的设施ID将现有课程集合中的每个文档附加到golfclub集合中的相应文档

我的最终结果是为集合组查询文档中列出的每个城市启用类似于地标查询的查询

Dart中的现有查询没有集合组查询

void getFSCourseList() {
    List<String> facility = [];
    var clubQuery = golfClubDatabase
        .collection("golfclub")
        .where("State", isEqualTo: "$_selectedState");

    clubQuery.getDocuments().then((clubSnap) {
      if (clubSnap.documents.length > 0) {
        print('club docs length = ${clubSnap.documents.length}'); // sanity check

        clubSnap.documents.forEach((document) {
          facility.add(document.data[
              "Facility ID"]); //add the facilities to a temp list for use in next query
        });
        var courseQuery = golfCourseDatabase
            .collection("course")
            .where("Facility ID", arrayContainsAny: facility); // doesn't return a value for some reason...

        courseQuery.getDocuments().then((courseSnap) {
          print('length of course snap = ${courseSnap.documents.length}'); // sanity check should be longer than clubSnap.length
          if (courseSnap.documents.length > 0) {
            print('length of course snap = ${courseSnap.documents.length}');
          }
        });
        facility.forEach((fac) => print(fac)); // sanity check should equal club-snap.length
        //print(facility.length);
      } else {
        print("Not Found");
      }
    });
  }
void getFSCourseList(){
列表设施=[];
var clubQuery=golfClubDatabase
.集合(“高尔夫俱乐部”)
。其中(“州”,isEqualTo:$_selectedState”);
clubQuery.getDocuments()然后((clubSnap){
如果(clubSnap.documents.length>0){
打印('club docs length=${clubSnap.documents.length}');//健全性检查
clubSnap.documents.forEach((文档){
facility.add(document.data[
“协作室ID”];//将协作室添加到临时列表中,以便在下一次查询中使用
});
var courseQuery=golfcourse
.收集(“课程”)
.where(“Facility ID”,arrayContainsAny:Facility);//由于某种原因不返回值。。。
courseQuery.getDocuments().then((courseSnap){
print('length of course snap=${courseSnap.documents.length}');//完整性检查应长于clubSnap.length
如果(courseSnap.documents.length>0){
打印('length of course snap=${courseSnap.documents.length}');
}
});
facility.forEach((fac)=>print(fac));//健全性检查应等于club-snap.length
//打印(设施、长度);
}否则{
打印(“未找到”);
}
});
}
您有两个选项:

1) 使用Firestore文档中的引用字段指向其他集合中的文档

2) 使用查询获取第一个集合中的文档引用,然后在代码中操作字符串,这样它就不会指向第一个集合中的文档,而是在新集合中创建一个新文档,但遵循相同的结构。 从同一查询中,您可以获取文档的所有数据,因此无需进行第二次查询

如果Firestore文档可能会有所帮助(即使目的不同),请参见此示例