这里是我的重点:用户可以访问不同的聊天室。当他们这样做时,如果尚未添加聊天室ID,则将其推入客户端的反应阵列中。如果没有,我将重新运行自动运行,该运行将订阅客户端在此会话中访问的每个聊天室的最后50条消息。
但是我希望他只能为每个聊天室接收50条最后一条消息!
以前我有:
Meteor.publish("getChatMess", function(cids) {
if (!Array.isArray(cids))
cids = [cids];
return (ChatMess.find({ chatId: cids[i] }, { sort: { date: -1 }, limit: (75 * cids.length) } ));
});
显然不符合我的需求,所以我做到了:
Meteor.publish("getChatMess", function(cids) {
if (!Array.isArray(cids))
cids = [cids];
let i = -1,
cursors = [];
while (cids[++i])
{
cursors.push(ChatMess.find({ chatId: cids[i] }, { sort: { date: -1 }, limit: 50 } ));
}
return (cursors);
});
但是,Meteor丢给我一个错误,因为我无法在一次操作中从同一集合中返回多个游标。
我该如何解决?我知道我可以检查每个聊天,选择每个聊天的最近50条消息(或更少)的ID,并向chatMess集合查询所有相应的ID,但是对于我想要的内容,它会很繁琐且未优化,尤其是在客户已经在会话中访问了数十个聊天室。
如meteor docs中所述
如果返回数组中的多个游标,则当前它们必须全部为来自不同的收藏。我们希望在将来的版本。
但是有一个名为smart-publish的软件包,可以帮助您管理同一集合中的多个游标。这可能会帮助https://atmospherejs.com/mrt/smart-publish
仅使用
Meteor.publish("getChatMess", function(cids) {
if (!Array.isArray(cids)) cids = [cids];
return ChatMess.find({chatId: {$in: cids}});
});