【问题标题】:meteor Autosubscribe maintain certain documents流星自动订阅维护某些文件
【发布时间】:2013-02-17 11:56:57
【问题描述】:

我正在使用自动订阅来获取 minimongo 中 50 个最新聊天文档的列表。随着更多消息的发布,旧消息会通过自动订阅从 minimongo 中删除。如何让自动订阅不删除我标记为活动的某些消息?

我知道我可以手动单独订阅“活动”消息列表,但这似乎不必要地费力。谢谢。

编辑:活动标记仅在客户端,每个用户都可以选择他关心的消息,这是短暂的。用户将消息标记为他正在回复的消息,因此不应突然将其删除。

【问题讨论】:

    标签: javascript mongodb meteor


    【解决方案1】:

    您需要按时间排序(_id 捕获它插入的顺序,因此是时间)以及状态,两者都按降序排列。

    服务器代码:

    Meteor.publish("messages", function () {
        return Messages.find({}, {sort: {active: -1, _id:-1}, limit: 50});
    });
    

    【讨论】:

      【解决方案2】:

      在发布功能中,按状态排序。

      Meteor.publish("messages", function () {
          return Messages.find({}, {sort: {status: 1}, limit: 50});
      });
      

      【讨论】:

        【解决方案3】:

        除非您的实现仅限于单个用户能够将行标记为活动,否则聊天行文档的标记需要使用活动用户id

        这很遗憾地导致需要单独订阅,即使它“看起来不必要地费力”

        另一种“费力的方法”是制作所选活动消息的本地客户端专用集合副本。

        【讨论】:

        • Another 'laborious way' would be to make a local client-only collection copy of the selected active messages. 我想过这个问题,但它似乎行不通。这会导致重新渲染,不是吗?
        【解决方案4】:

        每个客户端,维护一个包含标记文档 ID 数组的会话变量:

        Session.set('markedMessages',matchedDocs)

        在您的发布语句中,使用将与会话数组中的文档 ID 匹配的 $in 语句,结合此 $or 语句以利用您现有的查询、限制/切片。

        Meteor.publish("markedMessages", function () {
          Messages.find({$or: [{ your_existing_query_goes_here }, 
            {_id: { $in: Session.get('markedMessages')}} ] }).fetch()
        })
        

        ;

        请注意,在您的车把模板中,将消息 ID 与您的标记消息会话进行比较,以确定该消息是否被用户标记。

        【讨论】:

          猜你喜欢
          • 2015-09-27
          • 2016-02-17
          • 2012-10-01
          • 2014-05-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-17
          • 2015-11-13
          相关资源
          最近更新 更多