# #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),
})
])
};
Вы также можете использовать пакетную запись при обновлении этих полей, чтобы либо обе операции завершились неудачно, либо прошли успешно.