Пользовательский канал Firebase Firestore с отслеживаемыми темами - PullRequest
0 голосов
/ 05 мая 2020

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

Моя текущая структура (включены только применимые поля):

Posts --> uid 
           |- topics (array of topic uid max 5)

Topics --> uid
            |- post_count 

Users --> uid
           |- topics_following (array of topic uids)

если пользователь подписывается на 1 topi c (1234) Я могу легко создать их канал, получив n сообщений, содержащих этот topi c, вот так ...

let query = db.collection("posts").whereField("topics", arrayContains: "1234")

Это отлично, если пользователь следит за 10 разными темами. Но поскольку Firestore ограничивает IN или arrayContains до 10, как только количество тем, на которые пользователь подписывается, превышает 10, именно здесь возникают проблемы.

Я мог бы просто разделить все идентификаторы topi c на массивы из 10 и l oop через каждый, используя тот же запрос, что и выше. Но это могло привести к большим потерям чтения. Например, если пользователь подписан на 100 тем, а я получаю первые 20. Это будет 200 сообщений / прочтений (100/10 * 20). Пользователь редко просматривает такое количество контента.

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

Что когда бы я ни установил предел разбиения на страницы, я все равно получу неправильно упорядоченный фид. Если мы предположим на данный момент, что ограничение в 10 от Firestore является ограничением в 1 (для простоты), а пользователь следует за topi c A и topi c B, а предел разбивки на страницы равен 2.

topi c A имеет 3 сообщения со следующими отметками времени:

 - 1 hour ago
 - 2 hours ago
 - 3 hours ago

topi c B имеет 3 сообщения со следующими отметками времени:

 - 1 month ago
 - 2 months ago
 - 3 months ago

Лента пользователей будет выглядеть так это:

 - topic A (1 hour ago)
 - topic A (2 hours ago)
 - topic B (1 month ago)
 - topic B (2 months ago)

Как видите, это не дает точной ленты последних сообщений, на которые подписан пользователь. И если бы пользователь прокрутил до второй загрузки результатов, это привело бы к следующему:

 - topic A (1 hour ago)
 - topic A (2 hours ago)
 - topic B (1 month ago)
 - topic B (2 months ago)
 - topic A (3 hours ago)
 - topic B (3 months ago)

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

Есть ли другой способ сделать это для создания согласованного фида с хорошим уровнем эффективности чтения? Все еще на стадии архитектуры, поэтому я открыт для альтернативных структур данных, но хочу сохранить их в Firestore.

Спасибо.

...