Это довольно сложный вопрос (и я не уверен на 100%, что это именно то место, где его можно попросить), я сделаю все возможное, чтобы придти с чем-то, чтобы вы начали,
Отказ от ответственности, это может или нет для вашего варианта использования
Разделите ваш сервис на 3 коллекции: - пользователи - подписчики - сообщения
пользователи Коллекция очень проста, выпросто нужен идентификатор документа (он у вас уже есть).
{
"andyIsTheBest": {
uid: `andyIsTheBest`
// ...
},
"sophieTheBest": {
uid: `sophieTheBest`,
// ...
},
"andyTheWorst": {
uid: `andyTheWorst`,
// ...
},
}
подписчиков отражает идентификатор документа пользователя, он должен выглядеть следующим образом:
{
"andyIsTheBest": {
last_post: 2019,
followers: [
'sophieTheBest', 'andyTheWorst'
],
recent: [
{
post_id: 112233, // from the post collection
seq: 2019
}
]
}
}
Наконец, коллекция posts выглядит примерно так:
{
"112233": {
seq: 2019,
body: `blabla the cool post`
author: `andyIsTheBest`
}
}
Важно, обратите внимание на последовательность seq
number и last_post
, вы можете обновить это значение с помощью облачных функций, чтобы сохранитьследите за этим, тогда все остальное - просто детали реализации:
const remove = firebase.firestore.FieldValue.arrayRemove
const union = firebase.firestore.FieldValue.arrayUnion
const follow = async (toFollow, user) => {
await db
.collection('followers')
.doc(toFollow)
.update({ users: union(user) });
}
const unfollow = async (toUnFollow, user) => {
await db
.collection('followers')
.doc(toUnFollow);
.update({ users: remove(user) });
}
const feed = async (user) => {
await db.collection(`followers`)
.where(`users`, `array-contains`, user)
.orderBy(`last_post`, `desc`)
.limit(10)
.get()
// do whatever business logic you need down here
}
По сути, это не имеет значения, если у вас есть 1 или 1 триллион, запросы должны быть в порядке.
Есть много деталей, которые я не раскрыл, но это должно быть хорошочтобы начать.
Надеюсь, что эта помощь.
Кредиты моим коллегам, которые внедрили это в моей компании ^^