Структура модели социальных сетей Firestore - PullRequest
1 голос
/ 21 сентября 2019

У меня есть коллекция posts, в которой мое приложение хранит все сообщения пользователя со следующей структурой данных:

+ uid (the user id of the creator)
+ text-content : String
+ tagged-users: [String]
+ assigned-media: [{"downloadUrl": String, "storageLocation": String}]
+ type: String
+ typestamp: Timestamp
+ Likes
    + uid (the user id of the liking person)
    + timestamp: Timestamp
    + postId (optional, depending on the results of the collection group queries)

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

Я знаю, что просто запросить коллекцию, если пользователь следует только за одним человеком,т.е. у меня есть одно простое предложение where.Но: Что, если мой пользователь подписан на 10.000 человек или больше?Как я могу запросить это?

Кроме того, как я должен хранить followings, то есть людей, за которыми следует пользователь?Использование простого массива не подходит для меня, но со всеми остальными опциями я не могу запросить коллекцию постов для постов, от которых я следую.

Я был бы благодарен залюбая помощь, которую я мог получить!

1 Ответ

1 голос
/ 25 сентября 2019

Это довольно сложный вопрос (и я не уверен на 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 триллион, запросы должны быть в порядке.

Есть много деталей, которые я не раскрыл, но это должно быть хорошочтобы начать.

Надеюсь, что эта помощь.

Кредиты моим коллегам, которые внедрили это в моей компании ^^

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