Firebase Firestore - Запрос сообщений в большой коллекции, где groupId должен соответствовать значению в массиве. - PullRequest
0 голосов
/ 07 февраля 2019

У меня проблемы с firebase при использовании запроса cloudtore .where.Я хочу запросить большую коллекцию документов (в моем случае сообщений), но я хочу только запросить сообщения, в которых groupId соответствует любой из групп, в которых находится пользователь. Причина этого заключается в том, что я хочу запросить объединенныйФид для пользователя со всеми последними релевантными данными (используя orderBy и limit).

Я знаю, что могу использовать массив-содержимое, поэтому я мог бы, например, запросить все сообщения для пользователя, где пользователь являетсяmember.

firebase.db.collection('posts').where('members','array-contains',firebase.uid)

Это сработало бы, если бы я решил отслеживать участников в группе.Проблема в том, что если бы я менял участников в группе, мне пришлось бы перебирать все сообщения и менять массив участников (не очень хорошая практика).Лучше было бы, чтобы сообщение содержало и идентификатор группы, в которой оно было опубликовано.

Итак, предположим, что у пользователя есть массив, содержащий все группы, в которых он находится

user.groups = ['companyGroup', '{id}', '{id2}']

Затем я бы хотел запросить всю коллекцию сообщений и получить все документы, где поле groupId соответствует любому из значений в user.groups примерно так:

firebase.db.collection('posts').where('groupId','==',[any of user.groups])

или, может быть, наоборот:

firebase.db.collection('posts').where(user.groups,'array-contains','groupId')

^ Я не пробовал этот, но я уверен, что он не работает в соответствии с документами согласно

Метод where () принимает три параметра: поле для фильтрации, операцию сравнения и значение.Сравнение может быть <, <=, ==,>,> = или array_contains.

Есть ли возможный способ сделать что-то подобное?Я не могу на самом деле запросить несколько местоположений одновременно и объединить их, потому что это лишает цели возможности ограничивать поля data и orderBy.Я понимаю, что мог бы поместить новую коллекцию под названием feed для каждого пользователя, и для каждого сообщения использовать функцию firebase, которая подталкивает публикацию к соответствующему каналу участников (только id и latestActivity), но затем, как только это сообщение изменится (яЯ собираюсь использовать поле с именем latestActivity для упорядочения данных в соответствии с релевантностью, а также при удалении сообщения). Мне нужно было бы перебрать все документы под каждым пользователем и изменить значение / удалить документ.

Любые идеис благодарностью!

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

В настоящее время нет способа передать массив идентификаторов в функцию where() и ожидать получения всех документов, которые соответствуют каждому конкретному идентификатору:

firebase.db.collection('posts').where('groupId','==',[any of user.groups])

Опция, которая у вас есть,хранить в массиве либо идентификаторы в виде строк, либо ссылки (путь к групповым документам).Нет реального преимущества в хранении ссылок, а не строк, поэтому вам решать, какой из них вам удобнее.

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

Однако создание дополнительных обращений к базе данных не означает, что выборка, скажем, 3 документа, будет в 3 раза медленнее, чем выборкаодин документВы можете сделать несколько тестов самостоятельно.

Я цитирую @Frank van Puffelen: «В таких случаях Firebase имеет историю выполнения штрафов, поскольку конвейеризует запросы. »

0 голосов
/ 07 февраля 2019

Использовать массив содержит, он работает отлично.

firebase.db.collection('posts').where(user.groups,'array-contains','groupId') это работает довольно хорошо для меня.ты должен попробовать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...