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

时间:2020-01-05 15:53:27

标签: dart google-cloud-firestore

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

这两个集合共享一个公共字段(“设施ID”),并且具有多对一的关系(课程-> golfclub)。如在每个高尔夫俱乐部中,可能有1个或多个与之相关的球场。

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

我的最终结果将是对收集组查询文档中概述的每个城市启用类似于地标查询的查询。 https://firebase.google.com/docs/firestore/query-data/queries#collection-group-query

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");
      }
    });
  }

1 个答案:

答案 0 :(得分:0)

您有2个选择:

1)使用Firestore文档中的引用字段指向另一个集合中的文档。

2)使用查询在第一个集合中获取文档引用,然后在您的代码中操纵字符串,以便与其指向第一个集合中的文档,而不是指向新集合中的文档,但会在相同的结构。 从同一查询中,您可以通过事件获取文档的所有数据,因此无需第二次查询。

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