在线程中反应显示未读评论的数量?

时间:2015-08-01 22:58:17

标签: meteor

我正在使用主题中的主题和评论制作论坛类型的应用。我试图找出如何在每个用户的线程中显示未读评论的总数。

我考虑过为每个线程发布所有评论,但是当我想要的只是显示未读评论的单个数字时,这似乎是要发布到客户端的过多数据。但是,如果我开始向Thread集合添加元数据(例如numComments,numCommentsUnread ...),这会为应用程序添加额外的移动部分(即每次不同的用户向线程添加注释等时我都必须跟踪。 )。

处理此问题的最佳做法有哪些?

3 个答案:

答案 0 :(得分:0)

如果您需要的是计数,我建议您使用Publish-Counts包(https://github.com/percolatestudio/publish-counts)。如果您需要实际的相关注释,请查看meteor-composite-publish(https://github.com/englue/meteor-publish-composite)包。

答案 1 :(得分:0)

这听起来像是数据库设计问题。

您必须保留UserThreads的集合,该集合跟踪用户上次检查线程的时间。它有userId,threadId和lastViewed日期(或者你可能使用的任何明智的替代品)。

如果用户从未检查过线程,那么在UserThreads中没有对象,则未读计数将是注释计数。

当用户第一次查看线程时,为他创建一个UserThread对象。

每当他查看该帖子时,就更新UserThread上的lastViewed。

UnreadCommentCount将被反复计算。它是评论创建的线程上的注释总和比UserThread上的lastViewed更新。这可以是模板帮助函数,在视图中根据需要执行。例如,在子论坛视图中列出线程时,它只会计算当时在该列表中查看的线程。

或者,您可以在UserThread上保留unreadCommentCount属性。每次向线程发布注释时,您将遍历该Thread的UserThreads,更新unreadCommentCount。当用户稍后访问该线程时,您将unreadCommentCount重置为零并更新lastViewed。然后,用户将订阅他自己的UserThreads的发布,该发布将被动地更新。

似乎在构建论坛类型网站时,UserThread对象对于跟踪用户如何与线程交互是必不可少的。如果他看过它,忽略它,评论它,想订阅它但尚未评论等等。

答案 2 :(得分:0)

基于@datacarl answer,您可以修改线程发布以集成其他数据,例如未读注释的计数。以下是使用Cursor.observe()实现目标的方法。

var self = this;

// Modify the document we are sending to the client.
function filter(doc) {
  var length = doc.item.length;

  // White list the fields you want to publish.
  var docToPublish = _.pick(doc, [
      'someOtherField'
  ]);

  // Add your custom fields.
  docToPublish.itemLength = length;

  return docToPublish;                        
}

var handle = myCollection.find({}, {fields: {item:1, someOtherField:1}})
            // Use observe since it gives us the the old and new document when something is changing. 
            // If this becomes a performance issue then consider using observeChanges, 
            // but its usually a lot simpler to use observe in cases like this.
            .observe({
                added: function(doc) {
                    self.added("myCollection", doc._id, filter(doc));
                },
                changed: function(newDocument, oldDocument)
                    // When the item count is changing, send update to client.
                    if (newDocument.item.length !== oldDocument.item.length)
                        self.changed("myCollection", newDocument._id, filter(newDocument));
                },

                removed: function(doc) {
                    self.removed("myCollection", doc._id);                    
                });

self.ready();

self.onStop(function () {
  handle.stop();
});

我想你可以根据你的情况调整这个例子。如果需要,您可以删除白名单部分。计数部分将使用post.find({"unread":true, "thread_id": doc._id}).count()

等请求进行处理

实现这一目标的另一种方法是使用collection hooks。每次插入注释时,都会在插入后挂钩并更新专用字段"未读注释计数"在您的相关线程文档中。每次the user read a post,您都会更新该值。