Meteor中的合并集合

Meteor中的合并集合,meteor,Meteor,假设您希望在单个社交新闻提要上显示多个集合,例如帖子和用户(新注册)。您将如何在按创建日期排序的列表中反应性地显示这两者 想法1-在客户端进行合并 分别发布实体,并在客户端中按日期对每个实体进行排序,然后将它们合并到单个排序数组中,然后在{{each}迭代器中显示问题:AFAIK这需要将反应式游标展平为静态数组,因此现在页面不会更新。(也许有一种方法可以使页面在任何集合更改时重新计算此数组,从而挽救这种方法?) 想法2-创建新的收藏 您可以创建一个新集合,例如FeedItems。创建新的Post

假设您希望在单个社交新闻提要上显示多个集合,例如
帖子
用户
(新注册)。您将如何在按创建日期排序的列表中反应性地显示这两者

想法1-在客户端进行合并 分别发布实体,并在客户端中按日期对每个实体进行排序,然后将它们合并到单个排序数组中,然后在
{{each}
迭代器中显示问题:AFAIK这需要将反应式游标展平为静态数组,因此现在页面不会更新。(也许有一种方法可以使页面在任何集合更改时重新计算此数组,从而挽救这种方法?)

想法2-创建新的收藏 您可以创建一个新集合,例如
FeedItems
。创建新的
Post
User
时,您还可以创建一个新的
FeedItem
,并将相关信息复制到其中。在客户机中显示项目现在非常简单问题:现在规范对象和它们的
FeedItem
版本之间没有反应,因此如果有人更改了他们的名字、删除了帖子等,这不会反映在提要中。(也许有一种方法可以在集合之间创建反应性来挽救这种方法?)

想法3-出版物中的合并 也许有一些方法可以保留现有的收藏,但是创建一个额外的
'newsFeed'
出版物,以某种方式合并它们。然而,我还没有看到任何这样做的方法。我在文档中看到,您可以发布一系列集合,但这相当于一次发布一个相同的集合

这些方法中有一种是正确的吗?或者还有其他我没有想到的吗?

到目前为止,最简单的解决方案是在客户机上将它们合并到模板助手中。例如:

Template.dashboard.helpers({
peopleAndPosts:function(){
var people=people.find().fetch();
var posts=posts.find().fetch();
var docs=people.concat(posts);
return u.sortBy(docs,函数(doc){return doc.createdAt;});
}
});
和模板(假设人员和帖子有
名称
):


    {{{#每个人和帖子}
  • {{name}}
  • {{/每个}}

将是反应性的,因为助手是反应性上下文,因此对
人员
帖子的任何更改都将导致重新计算返回的数组。请注意,由于不返回光标,对任一集合的任何更改都将导致整个集合再次呈现。如果返回数组的长度相对较短,这将不是什么大问题。

想法1似乎是现成的。我创建了一个新的meteor项目,并将其更改如下:

test.js:

Users=newmeteor.Collection(“用户”);
Posts=新流星系列(“Posts”);
if(Meteor.isClient){
Template.hello.array=函数(){
var a=Users.find().fetch()
.concat(Posts.find().fetch());
return u.sortBy(a,函数(entry){return entry.voces;});
};
}
if(Meteor.isServer){
Meteor.startup(函数(){
//启动时在服务器上运行的代码
插入({name:“user1”,投票数:1});
插入({name:“user2”,投票数:4});
插入({name:“user3”,投票数:8});
插入({name:“user4”,投票数:16});
插入({姓名:“post1”,投票数:2});
插入({姓名:“post2”,投票数:4});
插入({姓名:“post3”,投票数:6});
插入({姓名:“post4”,投票数:8});
});
}
test.html:


测试
{{>你好}
{{{#每个数组}}
{{投票}{{name}}
{{/每个}}
这给出了预期的列表:

1 user1
2 post1
4 user2
4 post2
6 post3
8 user3
8 post4
16 user4
然后我做了
Users.insert({name:“new”,vots:5}
在控制台中,得到(反应性):


我遇到了这个问题,我想知道混合解决方案是否更好(或者至少更有效):

David提出的解决方案非常有效,但正如他所说,在处理大型收藏时可能会出现问题


保留一个本地集合(仅在客户机中),在创建模板时将两个集合合并到该本地集合中,然后注册一个观察者(或者为每个远程集合注册一个观察者)怎么样为了使本地收藏保持最新?

您好,David,我尝试了您的解决方案来合并两个收藏,但我遇到了一个问题,请您查看:并帮助我解决此问题如果收藏中的文档存在冲突(相同),该怎么办
\u id
?这没关系。它们从不一起存储在同一个集合中。
1 user1
2 post1
4 user2
4 post2
5 new
6 post3
8 user3
8 post4
16 user4