Как отфильтровать поток снимков на основе нескольких значений в массиве? - PullRequest
1 голос
/ 02 августа 2020

Я новичок в этом огненном шторме и управлении базами данных.

В моем коде много документов групп в коллекции групп. Теперь я хочу показать человеку из коллекции пользователей указанные c групп, к которым он подключен.

вот как выглядят uid групп: вот как выглядят группы UID

вот как выглядит документ пользователя: вот как выглядит документ пользователя

Код, который я использую для создания группового документа, таков: после создания документа я добавляю uid нового документа в пользовательский массив с именем groups.

Future createNewGroupData(String groupName) async {
    String _userID = await getUID();
    return await groupCollection.add({
      'creatorUID': _userID,
      'groupName': groupName,
      'teachers': [_userID],
    }).then((ref) => {
      userCollection.document(_userID).updateData({'groups': FieldValue.arrayUnion([ref.documentID])})
    });

это структура как я создаю документ для каждого пользователя,

Future updateUserData(int avatarID, String firstName, String lastName, String status, List groups, String school) async {
    return await userCollection.document(uid).setData({
      'avatarID': avatarID.round(),
      'firstName': firstName,
      'lastName': lastName,
      'status': status,
      'groups': groups,
      'school': school,
    });
  }

Как я реализовал это, когда пользователь был добавлен в группу. Uid этой группы был добавлен в массив под документами этого пользователя.

Теперь я хочу получить поток снимков групп, в массиве которых присутствуют только uid. Я действительно не могу найти способ реализовать это.

1 Ответ

1 голос
/ 02 августа 2020

Если я правильно понимаю, вы хотите загрузить документы группы, идентификатор документа которых совпадает с тем, что вы найдете в поле groups пользователя. В этом случае вы ищете комбинацию FieldPath.documentId и in запроса .

Что-то вроде:

Firestore.instance.collection('groups').where(FieldPath.documentId, whereIn: listOfUids)

Как показано в документации Firestore по ограничениям запросов , это будет работать только для идентификаторов до 10 документов:

Cloud Firestore обеспечивает ограниченную поддержку логических запросов OR. Операторы in и array-contains-any поддерживают логические OR из максимум 10 условий равенства (==) или array-contains для одного поля. В других случаях создайте отдельный запрос для каждого условия OR и объедините результаты запроса в своем приложении.

Если у вас больше идентификаторов документов, вам нужно будет запустить отдельный запрос для каждого ( до) 10.

См. также:

...