我正在使用自动订阅来获取 minimongo 中 50 个最新聊天文档的列表。随着更多消息的发布,旧消息会通过自动订阅从 minimongo 中删除。如何让自动订阅不删除我标记为活动的某些消息?
我知道我可以手动单独订阅“活动”消息列表,但这似乎不必要地费力。谢谢。
编辑:活动标记仅在客户端,每个用户都可以选择他关心的消息,这是短暂的。用户将消息标记为他正在回复的消息,因此不应突然将其删除。
我正在使用自动订阅来获取 minimongo 中 50 个最新聊天文档的列表。随着更多消息的发布,旧消息会通过自动订阅从 minimongo 中删除。如何让自动订阅不删除我标记为活动的某些消息?
我知道我可以手动单独订阅“活动”消息列表,但这似乎不必要地费力。谢谢。
编辑:活动标记仅在客户端,每个用户都可以选择他关心的消息,这是短暂的。用户将消息标记为他正在回复的消息,因此不应突然将其删除。
您需要按时间排序(_id 捕获它插入的顺序,因此是时间)以及状态,两者都按降序排列。
服务器代码:
Meteor.publish("messages", function () {
return Messages.find({}, {sort: {active: -1, _id:-1}, limit: 50});
});
每个客户端,维护一个包含标记的文档 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 与您的标记消息会话进行比较,以确定该消息是否由用户标记。
除非您的实现仅限于单个用户能够将行标记为活动,否则聊天行文档的标记需要使用活动用户id。
可悲的是,这导致需要单独订阅,即使它“看起来不必要地费力”
另一种“费力的方法”是制作所选活动消息的仅本地客户端集合副本。
在发布功能中,按状态排序。
Meteor.publish("messages", function () {
return Messages.find({}, {sort: {status: 1}, limit: 50});
});