Firebase中平面数据库结构的额外复杂性是否比集合上的简单.where()有效?如果是这样,从引用列表中获取对象的最有效方法是什么?
我看过的大多数Firestore示例都建议使用扁平结构来保存读取。例如如果要获取用户的所有餐厅,请创建第三个集合,以存储餐厅参考列表。
users
-u1id
restaurants
- r1id
- r2id
userRestaurants
-u1id
-restaurants: [r1id, r2id]
说得通,但我发现与此相反的讨论:https://github.com/flutter/flutter/issues/17476#issuecomment-426135287
”或(更好的方法)获取用户的文档参考,然后执行.where('user',isEqualTo:userDocRef)。后者使您可以通过一个简单的查询来获取所有杂货清单,这样既快捷又轻便“
通过某些Firebase魔术,集合中的“更快更轻”位于何处?
如果没有,获取文档列表的最佳方法是什么?
我尝试过的示例(代码示例中用空格代替餐馆):返回documentSnapshots流列表
Stream<List<DocumentSnapshot>>getUserSpacesFromId(String uid){
return userSpaceCollection.document(uid).snapshots().asyncMap((snap) async
{
List<dynamic> spaceArr = snap.data['spaces'];
var spaceList = <DocumentSnapshot>[];
for (var path in spaceArr) {
spaceList.add(await spaceCollection.document(path).get());
}
return spaceList;
});
}
或使用Future.wait链接期货:
Future<dynamic> getUserSpaces(List spaceList) async{
List<Future> futures = [];
for (var id in spaceList){
futures.add(spaceCollection.document(id).get());
}
return Future.wait(futures).then((List documents) =>
documents.map((documentSnapshot) => Space.fromMap(documentSnapshot.data)).toList()
).catchError((error) {
print('error: $error');
return false;
});
}