这是我的重点:用户可以访问不同的聊天室。当他们这样做时,如果ID尚未添加,我会在客户端的反应数组中推送聊天室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,但是对于我想要的内容,它会非常繁重且未被优化,特别是如果客户已经在会议中访问过几十个聊天室。
答案 0 :(得分:2)
如果在数组中返回多个游标,则它们当前必须全部都是 来自不同的收藏。我们希望解除这个限制 未来发布。
但是有一个名为smart-publish的软件包可以帮助您管理来自同一集合的多个游标。这可能有助于https://atmospherejs.com/mrt/smart-publish
答案 1 :(得分:-1)
只需使用
Meteor.publish("getChatMess", function(cids) {
if (!Array.isArray(cids)) cids = [cids];
return ChatMess.find({chatId: {$in: cids}});
});