如何将用户的 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,以便操作失败或通过。