【问题标题】:Firebase for getting unread postsFirebase 用于获取未读帖子
【发布时间】:2017-08-24 13:06:01
【问题描述】:

我正在创建一个具有类似于 Tinder 的“卡片堆栈”的应用,并带有 Firebase 实时数据库后端。每张卡片将是一个新的未读帖子,如果用户用完新帖子,他们将用完卡片。但是我不知道为此构建数据的最佳方法。我可以将已读帖子的 ID 存储在用户下,然后当我观看帖子提要时,我可以过滤掉客户端已读帖子吗?

这似乎有点混乱,而且在性能方面不是一个很好的选择。有更好的选择吗?

编辑:我在想的粗略代码:

数据示例

posts:
     "-KibasdkjbSAdASd": {
          title: 'New Post',
          body: {
              ...
          }
     },
     "-KisadBVsdadSd": {
          title: 'New Post 2',
          body: {
               ..
          }
     }
     "-KibaFNQsicaASd": {
          title: 'New Post 3',
          body: {
              ...
          }
     }

users :      
     "-KisadBVsdadSd": {
          name: 'Tom',
          readPosts: {
              "-KibasdkjbSAdASd": {
                   title: 'New Post',
                   body: {
                        ...
                   }
              },
              "-KisadBVsdadSd": {
                  title: 'New Post 2',
                  body: {
                       ..
                 }
             }
        }
     }

代码

const rootRef = firebase.database.ref();
const postRef = rootRef.child("posts");
const readPostRef = rootRef.child("users/"+uid+"/readPosts");

let readPosts= [];

//Get initial list of read posts
readPostRef.once("value", function(snapshot) {
  readPosts = Object.keys(snapshot);
});
//Update read posts when added
readPostRef.on("child_added", function(snapshot) {
  readPosts = Object.keys(snapshot);
});

 //Get list of posts, filtered on read post array
urlRef.on("value", function(snapshot) {
  snapshot.forEach(function(child) {
    if(!readPosts.includes(child.key)){
       //Unread post
    }
  });
});

【问题讨论】:

  • 我认为您的解决方案是正确的。您还可以使用 Cloud Functions 进行排序工作。

标签: javascript firebase firebase-realtime-database


【解决方案1】:

这取决于您向用户展示卡片的顺序。

如果您以可预测的顺序(例如从最新到最旧)显示它们,您只需记住用户看到的最后一张卡片的 ID。

如果您以随机或个性化的顺序显示它们,您可能确实需要准确跟踪每个用户已经看过的卡片。

我不知道为什么这会很混乱或表现不佳。所以如果你想要一个更好的选择,你必须展示你如何实现混乱/缓慢的选项。

【讨论】:

  • 谢谢!我可能会尝试按日期订购,但我认为在我的情况下随机选择会更好。我认为这可能只是因为我缺乏使用 Firebase 的经验而造成的混乱,我现在已经包含了代码来大致展示我的想法(可能是一些伪代码,我是即时编写的)。
  • 我仍然不确定这有什么问题。我可能不会为每个用户复制整个帖子,但这取决于您的用例。有许多级别的重复是有原因的。如果您是 NoSQL 新手并且对数据重复感到畏缩,我建议您阅读 NoSQL data modeling 并观看 Firebase for SQL developers
【解决方案2】:

我遇到了同样的设计问题。我只看到两个选项,也许还有其他选项!

1) 下载每篇文章并忽略已阅读的文章。当你有很多帖子时会很贵。

2) 将每个帖子的副本保存到每个用户帐户,并允许他们在阅读后删除它们。当您拥有大量用户时会很昂贵。

【讨论】:

    猜你喜欢
    • 2018-11-20
    • 1970-01-01
    • 2019-04-16
    • 1970-01-01
    • 2020-05-22
    • 1970-01-01
    • 1970-01-01
    • 2018-03-06
    相关资源
    最近更新 更多