Вложенные коллекции

Коллекция, созданная внутри документа, называется вложенной — subcollection. Например, коллекция «comments» внутри «posts» хранит комментарии конкретного поста.

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

осторожно
Ограничение

FlutterFlow поддерживает один уровень вложенности: коллекция → вложенная коллекция. Второй уровень (коллекция → вложенная 1 → вложенная 2) недоступен.

Вложенная коллекция внутри документа

инфо
Что нужно знать заранее

Пример: чат

Соберём страницу чат-комнаты: список сообщений и поле для нового.

совет
Как вложенные коллекции работают во FlutterFlow
  • Документ вложенной коллекции создаётся под существующей ссылкой — если сама вложенная коллекция описана.
  • Запросить вложенную коллекцию можно двумя способами: указать ссылку на родительский документ (UserA → favorites) или не указывать её вовсе — тогда получится запрос collectionGroup по всем вложенным коллекциям сразу (все Users → Favorites).

Сначала структура. Нужны две коллекции: одна с описанием комнат, другая с сообщениями. Сообщения всегда показываются в контексте конкретной комнаты, поэтому им место во вложенной коллекции.

Получается так:

Структура базы: chat_rooms и вложенная messages

Порядок работы:

  1. Создать коллекцию
  2. Создать вложенную коллекцию
  3. Наполнить коллекцию данными
  4. Собрать страницу со списком комнат
  5. Собрать страницу сообщений

1. Создать коллекцию

Создайте коллекцию chat_rooms — в ней будут описания комнат. В схему добавьте поле для названия: chat_room_name.

Схема коллекции chat_rooms

2. Создать вложенную коллекцию

  1. Откройте Firestore в меню слева.
  2. Нажмите кнопку (+).
  3. Введите название коллекции — messages.
  4. Включите тумблер Is Subcollection.
  5. Появится список существующих коллекций: нажмите Unset и выберите родительскую — здесь это chat_rooms.
  6. Нажмите Create.
  7. Опишите схему документа: для «messages» это поля message (текст сообщения) и from (кто отправил).

3. Наполнить коллекцию данными

Добавьте несколько комнат через Firestore Content Manager.

4. Страница со списком комнат

Первая страница показывает список комнат; по нажатию открывается вторая — с сообщениями.

  1. Запросите коллекцию chat_rooms и выведите названия комнат в ListTile внутри ListView.
  2. На Tap у ListTile добавьте действие Navigate To и откройте страницу сообщений. При переходе передайте на неё запись комнаты — как это делается, описано в разделе про передачу данных между страницами.

5. Страница сообщений

Вторая страница показывает сообщения и позволяет отправить новое.

  1. Соберите страницу из ListView, ListTile, TextField и Button — примерно так:

    Страница сообщений чата

  2. На ListView повесьте запрос к вложенной коллекции. Он ничем не отличается от обычного, кроме одного: нужно указать ссылку на родительский документ — в нашем случае на комнату из chat_rooms. Тогда придут сообщения только этой комнаты.

  1. На нажатие кнопки «Send» добавьте действие create document для коллекции messages и передайте текущую ссылку на chat_rooms. Текст сообщения возьмите из From Variable > Widget State > [имя TextField].

перевод официальной документации FlutterFlow

обновлено

⌕ ESC