返回Meteor.js上的多个游标

问题描述 投票:3回答:2

这里是我的重点:用户可以访问不同的聊天室。当他们这样做时,如果尚未添加聊天室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,但是对于我想要的内容,它会很繁琐且未优化,尤其是在客户已经在会话中访问了数十个聊天室。

javascript node.js mongodb meteor
2个回答
2
投票

meteor docs中所述

如果返回数组中的多个游标,则当前它们必须全部为来自不同的收藏。我们希望在将来的版本。

但是有一个名为smart-publish的软件包,可以帮助您管理同一集合中的多个游标。这可能会帮助https://atmospherejs.com/mrt/smart-publish


0
投票

仅使用

Meteor.publish("getChatMess", function(cids) {
    if (!Array.isArray(cids)) cids = [cids];
    return ChatMess.find({chatId: {$in: cids}});
});
© www.soinside.com 2019 - 2024. All rights reserved.