Firestore + Flutter:从文档引用列表中获取数据的最有效方法

时间:2019-02-03 22:26:17

标签: firebase flutter google-cloud-firestore

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

0 个答案:

没有答案