我正在使用主题中的主题和评论制作论坛类型的应用。我试图找出如何在每个用户的线程中显示未读评论的总数。
我考虑过为每个线程发布所有评论,但是当我想要的只是显示未读评论的单个数字时,这似乎是要发布到客户端的过多数据。但是,如果我开始向Thread集合添加元数据(例如numComments,numCommentsUnread ...),这会为应用程序添加额外的移动部分(即每次不同的用户向线程添加注释等时我都必须跟踪。 )。
处理此问题的最佳做法有哪些?
答案 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,您都会更新该值。