2

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

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

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

4

4 回答 4

1

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

服务器代码:

Meteor.publish("messages", function () {
    return Messages.find({}, {sort: {active: -1, _id:-1}, limit: 50});
});
于 2013-02-08T19:34:26.633 回答
0

每个客户端,维护一个包含标记的文档 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 与您的标记消息会话进行比较,以确定该消息是否由用户标记。

于 2013-02-17T03:56:57.303 回答
0

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

可悲的是,这导致需要单独订阅,即使它“看起来不必要地费力”

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

于 2013-02-15T22:45:09.027 回答
0

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

Meteor.publish("messages", function () {
    return Messages.find({}, {sort: {status: 1}, limit: 50});
});
于 2013-02-08T18:43:19.407 回答