Firebase FireStore сложный запрос - PullRequest
1 голос
/ 04 июня 2019

Мне интересно, возможно ли это, и является ли это хорошим решением моей проблемы.

Я хочу, чтобы пользователи могли subscribe к содержанию. Контент связан с id .. например:

'JavaScript': 1,
'C++': 2,
'Python': 3,
'Java': 4,

Допустим, пользователь подписывается на 1, 3 и 4.

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

'subscribed_to': [1,3,4]

Теперь у меня в пожарном депо у меня есть сообщения. Каждому сообщению присваивается content_id (например, 1-4), и поэтому, когда я запрашиваю контент, на который подписан этот пользователь, как бы я сделал это настолько эффективно, насколько это возможно?

1 Ответ

3 голосов
/ 04 июня 2019

Это действительно сложный, но распространенный случай, я бы рекомендовал установить структуру данных, подобную:

{ 
   "subscriptions" {
      javascript: { ... },
      python: { ... },
      java: { ... }
   },
   "users": {
      1: {
        subscribed_to: ['javascript', 'python']
      }
   }
}

Очень важно, чтобы на вашем subscribed_to реквизите вы использовали имя doc, потому что именно эта часть позволяет вам запрашивать их (документы).

большая проблема, как мне запросить эти данные? У меня нет объединений!

Дело 1:

Предполагая, что у вас есть пользовательские данные, когда вы применяете нагрузку ...

const fetchDocs = async (collection, docs) => {
    const fetchs = docs.map(id => collection.doc(id).get())
    const responses = await Promise.all(fetchs)
    return responses.map(r => r.data())
}

const userSubscriptions = ['javascript', 'python']
const mySubscriptions = await fetchDocs(`subscriptions`, userSubscriptions)

За кулисами SDK сгруппирует все запросы и приложит все усилия, чтобы доставить их вместе. Это работает хорошо, я на 99% уверен, что вам все равно придется платить за каждый запрос индивидуально каждый раз, когда пользователь входит в систему.

Дело 2:

Создайте коллекцию панели мониторинга вида и предварительно рассчитайте dashboard за сценой. Этот подход включает облачные функции для прослушивания или изменения пользовательских изменений (и, возможно, подписок) и копирования каждого отдельного документа в другую коллекцию. скажем subscriptions_per_users. Это более сложный подход, мне потребуется больше времени для объяснения, но если у вас большое приложение, где важны затраты, и если пользователь собирается подписаться на множество вещей, то вы можете изучить его.

Источник: мой собственный опыт ... немного гугла также может помочь, кажется, есть много мнений по этому поводу, найдите то, что работает лучше для вас.

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