我正在尝试显示具有Firebase集合中发生的事件的ListView,其中包含对另一个集合的引用,但是我无法获取它来完整返回信息。有没有办法引用第二个集合并返回完整数据?
我已经尝试过这种方法,但是它不起作用
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();
}
答案 0 :(得分:1)
在Firestore中,查询为shallow
,这意味着它们仅从执行查询的集合中获取数据,因此没有直接方法可在单个查询中获取subcollection
的数据
尽管您可以Collection group queries从子集合中获取数据。
一些资源,用于了解集合组查询以及如何定义架构
答案 1 :(得分:0)
在“事件”文档中,您的位置字段似乎没有使用“引用”类型的字段。因此,请确保将此字段设置为“引用”,并且其中包含有效值。
该字段的正确值应该是完整的文档路径。
您的情况是:
places/socialClub
然后,您应该能够从事件对象访问位置快照,如下所示:
data['place'].get();
有关更多信息:https://firebase.google.com/docs/reference/js/firebase.database.Reference