在Meteor.js上返回多个游标

时间:2016-01-12 18:08:13

标签: javascript node.js mongodb meteor

这是我的重点:用户可以访问不同的聊天室。当他们这样做时,如果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,但是对于我想要的内容,它会非常繁重且未被优化,特别是如果客户已经在会议中访问过几十个聊天室。

2 个答案:

答案 0 :(得分:2)

meteor docs

中所述
  

如果在数组中返回多个游标,则它们当前必须全部都是   来自不同的收藏。我们希望解除这个限制   未来发布。

但是有一个名为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}});
});