#flutter #&oo&le-cloud-firestore #stream-builder
#flutter #&oo&le-cloud-firestore #stream-builder
Вопрос:
Моя цель — передать все сообщения в базу данных по пути ‘chat /$chattype/room /{roomId} /messa&e’, где мне нужно запросить все сообщения, содержащие документ со строкой, в которой есть ‘user1’, без явного указания идентификатора комнаты. Похоже, не получается заставить его работать с подстановочным знаком, но .. возможно ли вместо этого выполнить запрос, скажем, из ‘chat / $ chattype / room/’?
Wid&et build(BuildContext context) {
return StreamBuilder<QuerySnapshot&&t;(
stream: _firestore
.collection('chat/$chattype/room/{roomID}/messa&e')
.where("reciever", isEqualTo: "user1")
.snapshots(),
builder: (context, snapshot) {
if (!snapshot.hasData) {
...
Ответ №1:
Единственный способ запросить несколько коллекций — это использовать запрос группы коллекций, который запрашивает все коллекции с заданным именем.
Итак:
_firestore
.collectionGroup('messa&e')
.where("reciever", isEqualTo: "user1")
.snapshots(),
Также смотрите справочную документацию Flutter для collectionGroup()
.
Комментарии:
1. Я вижу, как это будет работать, спасибо. Однако не будет ли это большой нагрузкой на базу данных? Я имею в виду, что если у меня, например, есть миллион сообщений, он должен выполнить поиск, а не указывать $ chattype, что сократило бы его, возможно, только до 1000 поисков?
2. Разработчики Firestore намного опережают вас. Большая часть производительности Firestore зависит от индексации; вам нужно будет либо создать индекс collectionGroup, либо при первом запуске запроса Firestore выдаст сообщение об ошибке со ссылкой для автоматического создания индекса для вас. Производительность не потеряна вообще.
3. Из-за того, как Firestore индексирует данные, на самом деле это не является дополнительной нагрузкой. Чтобы разрешить запрос группы коллекций, вы должны определить индекс для этой группы коллекций. И именно с этого индекса Firestore запускает запрос. Запись данных является более распространенным ограничением пропускной способности для Firestore, поэтому я бы рекомендовал найти уникальное имя для коллекций в группе, которую вы хотите запросить (
chat/$chattype/room/{roomID}/messa&e
). Итак, если у вас естьmessa&e
коллекции и в других местах Firestore, возможно, стоит назвать их чем-то вродеchatroommessa&es
.4. Спасибо за ваши ответы 🙂 Я подробнее прочитаю о collectionGroupin&.
Ответ №2:
Запросы Firestore не поддерживают никаких подстановочных знаков. Вы должны иметь возможность создать полный путь к коллекции, чтобы запросить ее.
Возможно, вы также захотите изучить запросы группы коллекций, которые позволяют запрашивать все документы в любой вложенной коллекции с тем же именем. Возможно, вы сможете использовать запрос группы сбора в «сообщении» для запроса всех сообщений для всех типов чатов для всех комнат, применяя фильтр оттуда, если это необходимо.