Flutter:从Firebase中的两个集合中获取数据

时间:2020-05-20 15:31:57

标签: firebase flutter google-cloud-firestore

我正在尝试显示具有Firebase集合中发生的事件的ListView,其中包含对另一个集合的引用,但是我无法获取它来完整返回信息。有没有办法引用第二个集合并返回完整数据?

Places Events

我已经尝试过这种方法,但是它不起作用

class Event {
  String id;
  Timestamp date;
  String description;
  String name;
  String place;
  Place placeData;

  Event(this.id, this.date, this.description, this.name, this.place);
  Event.withPlace(this.id, this.date, this.description, this.name, this.place, this.placeData);

  Event.fromFirestore(DocumentSnapshot doc)
      : id= doc.documentID,
        date = doc.data['date'] ?? '',
        description = doc.data['description'] ?? '',
        name = doc.data['name'] ?? '',
        place = doc.data['place'] ?? '';
}

Stream<List<Event>> getFutureEventsFromFirestore() {
  return Firestore.instance.collection('events').orderBy('date', descending: false).snapshots().map(futureEventListWithPlace);
}

List<Event> futureEventList(QuerySnapshot query) {
  return query.documents.where((event) => event['date'].toDate().isAfter(DateTime.now())).map((event) => Event.fromFirestore(event)).toList();
}

List<Event> futureEventListWithPlace(QuerySnapshot query) {
  return query.documents.where((event) => event['date'].toDate().isAfter(DateTime.now())).map((event) {
    final Event eventF = Event.fromFirestore(event);
    FirebaseProvider.getPlaceFromFirestore(eventF).then((value){
      Event.withPlace(eventF.id, eventF.date, eventF.description, eventF.name, eventF.place, value);
    });
  }).toList();
}

Future<Place> getPlaceFromFirestore(Event event) async {
  DocumentReference documentReference = Firestore.instance.collection("places").document(event.place);
  await documentReference.get().then((DocumentSnapshot ds) {
    return Place.fromMap(ds.data);
  });
}

List<Event> pastEventList(QuerySnapshot query) {
  return query.documents.where((event) => event['date'].toDate().isBefore(DateTime.now())).map((event) => Event.fromFirestore(event)).toList();
}

2 个答案:

答案 0 :(得分:1)

在Firestore中,查询为shallow,这意味着它们仅从执行查询的集合中获取数据,因此没有直接方法可在单个查询中获取subcollection的数据

尽管您可以Collection group queries从子集合中获取数据。

一些资源,用于了解集合组查询以及如何定义架构

  1. Understanding collection group queries
  2. Maps, Arrays and Subcollections

答案 1 :(得分:0)

在“事件”文档中,您的位置字段似乎没有使用“引用”类型的字段。因此,请确保将此字段设置为“引用”,并且其中包含有效值。

该字段的正确值应该是完整的文档路径。

您的情况是:

places/socialClub

然后,您应该能够从事件对象访问位置快照,如下所示:

data['place'].get();

有关更多信息:https://firebase.google.com/docs/reference/js/firebase.database.Reference