![](/img/trans.png)
[英]how to manipulate returned mongo collections / cursors in javascript (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.