如何将用户的 activity 存储在 firestore 中?
How do I store user's activity in firestore?
我正在构建一个社交媒体应用程序(非常简单),我想将用户的 activity 存储在 firestore 数据库中。我有一个“用户”集合,我在那里保存用户 ID、用户名、用户个人资料图片。但我不认为用户的 activity 也应该存储在那里(如果我错了请纠正我?)
所以我创建了一个名为 UserActivity
的新集合,用于存储用户的 activity。我想存储用户是否一直在搜索个人资料,所以我执行以下操作:
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 名粉丝资料”或类似内容的用户案例呢? IE。我如何计算谁最常访问您的个人资料?
根级集合“userActivity”(或子集合)应该足够了。您可以将 activity 类型存储为字段而不是子集合,如下所示:
users -> {userId} -> userActivity -> {logId}
(col) (doc) (col) (doc)
But then how do I calculate which are the most "popular" profiles?
您可以在该配置文件的文档中存储一个数字字段,每当调用 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),
})
])
};
您还可以在更新这些字段时使用 batch writes,以便操作失败或通过。
我正在构建一个社交媒体应用程序(非常简单),我想将用户的 activity 存储在 firestore 数据库中。我有一个“用户”集合,我在那里保存用户 ID、用户名、用户个人资料图片。但我不认为用户的 activity 也应该存储在那里(如果我错了请纠正我?)
所以我创建了一个名为 UserActivity
的新集合,用于存储用户的 activity。我想存储用户是否一直在搜索个人资料,所以我执行以下操作:
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 名粉丝资料”或类似内容的用户案例呢? IE。我如何计算谁最常访问您的个人资料?
根级集合“userActivity”(或子集合)应该足够了。您可以将 activity 类型存储为字段而不是子集合,如下所示:
users -> {userId} -> userActivity -> {logId}
(col) (doc) (col) (doc)
But then how do I calculate which are the most "popular" profiles?
您可以在该配置文件的文档中存储一个数字字段,每当调用 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),
})
])
};
您还可以在更新这些字段时使用 batch writes,以便操作失败或通过。