我知道我在这里问的很多,但是没有人给我正确的答案。
我只需要返回一个列表,其中包含Firebase子集合中的值。
这是我的代码:
List mapToList({DocumentSnapshot doc, List<DocumentSnapshot> docList}) {
if (docList != null) {
List<Store> storeList = [];
docList.forEach((document) async {
String productName;
String name = document.data[StringConstant.nameField];
QuerySnapshot productRef = await document.reference.collection('products').getDocuments();
productRef.documents.forEach((value){
productName = value["name"];
});
Store otherStore = Store(name, productName);
storeList.add(otherStore);
});
print(storeList.length);
return storeList;
} else {
return null;
}
}
或者我想要这样的东西:
List mapToList({DocumentSnapshot doc, List<DocumentSnapshot> docList}) {
if (docList != null) {
List<Store> storeList = [];
docList.forEach((document) async {
//I KNOW THIS IS WRONG, BUT I NEED SOMETHING LIKE THE LINE BELOW
String productName = document.data.reference.collection("products").data["productName];
String name = document.data["name];
Store otherStore = Store(name, productName);
storeList.add(otherStore);
});
return storeList;
} else {
return null;
}
}
如何获取此列表?
答案 0 :(得分:1)
子集合没有“字段”,您可以按照希望的方式直接访问这些“字段”。如The Cloud Firestore Data Model中所述,集合和子集合实际上都只是一组文档的名称。您不能直接访问子集合中的字段,必须先引用该子集合中的文档,然后再引用该文档的字段。文档是唯一包含字段的东西。
针对您的情况,我建议您仅在此处考虑的每个文档的product字段中存储一张地图。或者,如果您绝对必须使用子集合(可能是为将来的模式更改保留灵活性的一种方式),请使用document.collection('products').document('productName')["value"]
或类似的东西。
子集合的工作方式是这样的,因为它们确实提供了一种存储仅与特定文档相关的数据的方法,因此该文档的安全设置也固有地应用于子集合。就像链接中的示例一样,rooms
是聊天室的集合,每个聊天室都是带有名称和对messages
子集合的引用的文档,每个子集合都包含消息及其作者。如果没有messages
文档,则room
子集合会失去上下文。