【问题标题】:Flutter: Get data from two collections in FirebaseFlutter:从 Firebase 中的两个集合中获取数据
【发布时间】:2020-09-07 01:11:48
【问题描述】:

我正在尝试显示一个 ListView,其中包含我在 firebase 集合中拥有的事件,并且其中引用了另一个集合,但我无法让它完整地返回信息。有没有办法引用第二个集合并返回完整数据?

我尝试过这样做,但它不起作用

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

【问题讨论】:

  • Firestore 一次只能查询一个集合。如果您想要来自第二个集合的数据,则必须单独查询它。集合之间没有类似 SQL 的连接。
  • 我尝试使用 futureEventListWithPlace 函数,但它不起作用

标签: firebase flutter google-cloud-firestore


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    在你的情况下是:

    places/socialClub
    

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

    data['place'].get();
    

    欲了解更多信息:https://firebase.google.com/docs/reference/js/firebase.database.Reference

    【讨论】:

      猜你喜欢
      • 2021-03-05
      • 2020-09-08
      • 2022-11-06
      • 2021-03-06
      • 1970-01-01
      • 1970-01-01
      • 2018-03-24
      • 2021-09-05
      • 2021-08-02
      相关资源
      最近更新 更多