繁体   English   中英

在 Meteor.js 上返回多个游标

[英]Returning multiple cursors on Meteor.js

这是我的重点:用户可以访问不同的聊天室。 当他们这样做时,如果尚未添加 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 向我抛出一个错误,因为我不能在一个 puslish 中从同一个集合中返回多个游标。

我该如何解决? 我知道我可以检查每个聊天,选择每个聊天的最后 50 条消息(或更少)的 ID,并查询 chatMess 集合以获取所有相应的 ID,但对于我想要的内容来说它会非常繁重且未优化,尤其是如果客户已经在会话中访问了数十个聊天室。

正如流星文档中所述

如果您在一个数组中返回多个游标,它们当前必须都来自不同的集合。 我们希望在未来的版本中取消此限制。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM