Meteor 反应式显示线程中未读注释的数量?

Meteor 反应式显示线程中未读注释的数量?,meteor,Meteor,我正在制作一个论坛类型的应用程序,在一个线程中包含线程和评论。我试图找出如何向每个用户显示线程中未读评论的总数 我考虑过为每个线程发布所有注释,但是当我只需要一个显示未读注释的数字时,向客户端发布的数据似乎过多。但是,如果我开始向线程集合添加元数据(例如numComments、numCommentsUnread…),这会向应用程序添加额外的移动部分(即,每次不同的用户向线程添加注释时,我都必须跟踪,等等) 处理这个问题的一些最佳实践是什么?如果您只需要计数,我建议您使用Publish Count

我正在制作一个论坛类型的应用程序,在一个线程中包含线程和评论。我试图找出如何向每个用户显示线程中未读评论的总数

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


处理这个问题的一些最佳实践是什么?

如果您只需要计数,我建议您使用Publish Counts包()。如果您需要实际的相关注释,请查看meteor composite publish()包。

如果您只需要计数,我建议使用publish Counts包()。如果您需要实际的相关注释,请查看meteor composite publish()包。

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

您必须保留一个UserThreads集合,它跟踪用户上次检查线程的时间。它有userId、threadId和lastViewed日期(或者您可能使用的任何合理的替代方法)

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

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

每当用户查看线程时,更新用户线程上的lastViewed

将以反应方式计算UnreadCommentCount。它是线程上的注释总和,其中注释的createdAt比UserThread上的lastViewed更新。这可以是根据需要在视图中执行的模板辅助函数。例如,当在子窗体视图中列出线程时,它将只计算当时在该列表中查看的线程

或者,您可以在UserThread上保留unreadCommentCount属性。每次将注释发布到该线程时,您都会迭代该线程的用户线程,更新unreadCommentCount。当用户稍后访问该线程时,您会将unreadCommentCount重置为零,并更新lastViewed。然后,用户将订阅他自己的UserThreads的发布,该发布将进行反应性更新


似乎在构建论坛类型的站点时,UserThread对象对于跟踪用户如何与线程交互是必不可少的。如果他查看过,忽略了它,在其中发表了评论,想订阅但还没有发表评论,等等。

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

您必须保留一个UserThreads集合,它跟踪用户上次检查线程的时间。它有userId、threadId和lastViewed日期(或者您可能使用的任何合理的替代方法)

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

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

每当用户查看线程时,更新用户线程上的lastViewed

将以反应方式计算UnreadCommentCount。它是线程上的注释总和,其中注释的createdAt比UserThread上的lastViewed更新。这可以是根据需要在视图中执行的模板辅助函数。例如,当在子窗体视图中列出线程时,它将只计算当时在该列表中查看的线程

或者,您可以在UserThread上保留unreadCommentCount属性。每次将注释发布到该线程时,您都会迭代该线程的用户线程,更新unreadCommentCount。当用户稍后访问该线程时,您会将unreadCommentCount重置为零,并更新lastViewed。然后,用户将订阅他自己的UserThreads的发布,该发布将进行反应性更新

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

基于@datacarl,您可以修改线程发布以集成其他数据,例如未读评论的计数。下面是如何使用
Cursor.observe()
实现它的

我想你可以把这个例子改编成你的案例。如果需要,可以删除白名单部分。计数部分将使用诸如
post.find({“unread”:true,“thread\u id”:doc.\u id}).count()之类的请求来覆盖


实现这一目标的另一种方法是使用。每次插入注释时,都会在插入后挂接,并更新相关线程文档中的专用字段“未读注释计数”。每次更新值。

基于@datacarl,您可以修改线程发布以集成其他数据,例如未读评论的计数。下面是如何使用
Cursor.observe()
实现它的

我想你可以把这个例子改编成你的案例。如果需要,可以删除白名单部分。计数部分将使用诸如
post.find({“unread”:true,“thread\u id”:doc.\u id}).count()之类的请求来覆盖



实现这一目标的另一种方法是使用。每次插入注释时,都会在插入后挂接,并更新相关线程文档中的专用字段“未读注释计数”。每次都会更新值。

我已经查看了发布计数。发布计数不是只返回一个数字吗?如果我只是寻找一个总的Threa数,那就行了
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();
});