Как мне сохранить активность пользователя в firestore?

# #javascript #firebase #google-cloud-firestore #database-design #nosql

Вопрос:

Я создаю приложение для социальных сетей (очень простое) и хочу хранить активность пользователя в базе данных firestore. У меня есть коллекция «пользователей», и я храню там идентификатор пользователя, имя пользователя, фотографию профиля пользователя. Но я не думаю, что активность пользователя также должна храниться там (поправьте меня, если я ошибаюсь?)

Поэтому я создал новую коллекцию под названием UserActivity «Где я храню действия пользователя». Я хотел сохранить, выполнял ли пользователь поиск в профиле, поэтому я делаю следующее:

 const logUserSearch = async (term) => {
    await firebase
      .firestore()
      .collection("userActivity")
      .doc(firebase.auth().currentUser.uid)
      .collection("userSearch")
      .add({
        term: term,
        date: firebase.firestore.FieldValue.serverTimestamp(),
      })
  };
 

Я думаю, что приведенный выше запрос решает проблему с поисковым запросом пользователя. Однако я хочу сохранить, посетил ли пользователь профиль. Итак, вот мой вопрос: как правильно хранить, если пользователь посетил профиль? Должен ли я добавить новую подборку «profileVisit», что-то в этом роде:

 const logProfileVisit = async (searchTerm, profileId) => {
    await firebase
      .firestore()
      .collection("userActivity")
      .doc(firebase.auth().currentUser.uid)
      .collection("profileVisit")
      .doc(profileId) 
      .add({
        source: searchTerm,
        date: firebase.firestore.FieldValue.serverTimestamp(),
      })
  }; 
 

Но тогда как мне вычислить, какие профили являются наиболее «популярными»? Должен ли я создать свою базу данных другим способом, например так:

 const logProfileVisit = async (searchTerm, profileId) => {
        await firebase
          .firestore()
          .collection("userActivity")
          .doc(profileId)
          .collection("profileVisit")
          .add({
            user: firebase.auth().currentUser.uid
            source: searchTerm,
            date: firebase.firestore.FieldValue.serverTimestamp(),
          })
      };
 

Чтобы я мог легко вычислить, какие профили являются наиболее «популярными»? Как насчет пользовательского случая, когда мне нужно рассчитать «топ-10 профилей поклонников» или что-то подобное? Т. Е. Как мне вычислить, кто чаще всего посещал ваш профиль?

Ответ №1:

Коллекции корневого уровня «Активность пользователя» (или подколлекции) должно быть достаточно. Вы можете сохранить тип действия в виде поля вместо вложенных коллекций, как показано ниже:

 users -> {userId} -> userActivity -> {logId}
(col)     (doc)        (col)          (doc)
 

Но тогда как мне вычислить, какие профили являются наиболее «популярными»?

Вы можете сохранить числовое поле в документе этого профиля и при logProfileVisit каждом вызове увеличивать его:

 const usersCol =  firebase.firestore().collection("users")

const logProfileVisit = async (searchTerm, profileId) => {
  await Promise.all([
    usersCol
      .doc(currentUserId)
      .collection("userActivity")
      .add({
        source: searchTerm,
        date: firebase.firestore.FieldValue.serverTimestamp(),
        type: "profileVisit"
      }),
    usersCol
      .doc(profileUserId)
      .update({
        profileViews: firebase.firestore.FieldValue.increment(1),
      })
  ])
};
 

Вы также можете использовать пакетную запись при обновлении этих полей, чтобы либо обе операции завершились неудачно, либо прошли успешно.