Firestore + Flutter: самый эффективный способ получить данные из списка ссылок на документы - PullRequest
0 голосов
/ 04 февраля 2019

Является ли дополнительная сложность плоской структуры базы данных в Firebase более эффективной, чем простая .where () в коллекции?Если да, то каков наиболее эффективный способ получить объекты из списка ссылок?

Большинство примеров Firestore, на которые я смотрел, предлагают плоскую структуру для сохранения чтения.Например, если вы хотите получить все рестораны пользователя, создайте третью коллекцию, в которой хранится список ссылок на рестораны.

users
  -u1id

restaurants
  - r1id      
  - r2id

userRestaurants
  -u1id
       -restaurants: [r1id, r2id]

Имеет смысл, но я нашел это обсуждение, которое говорит об обратном: https://github.com/flutter/flutter/issues/17476#issuecomment-426135287

"или (лучший метод) получить ссылку на документ пользователя, а затем выполнить a.где ('user', isEqualTo: userDocRef). Последний позволяет получать все списки покупок одним простым запросом, который быстрее и легче "коллекция "быстрее и легче"?

Если нет, как лучше всего получить список документов?

Примеры, которые я пробовал (пробел вместо ресторана в примерах кода): возвращениесписок потока 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;
   });
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...