meteor中的4级订阅嵌套
我正在使用meteor,这是我的模式,每个都是一个单独的集合: 课程有很多讲座 讲座有很多问题 问题有很多答案 我想要一页,在那里我可以显示给定课程的讲座、问题和答案。我可以显示课程的讲义没有问题,但是我在显示更多嵌套项方面有问题。理想情况下,我想要: 讲座已经开始了 答案已被删除(但未被删除) 问题有答案(但不是讲师ID或课程ID) 这是明智的还是我应该在所有子组件中嵌入CourseID和讲师ID?这是我的iron router,我试图扩展与嵌套带问题的讲座相同的想法,但我遇到了一个绊脚石,即如何向讲师ID提供订阅:meteor中的4级订阅嵌套,meteor,meteor-blaze,Meteor,Meteor Blaze,我正在使用meteor,这是我的模式,每个都是一个单独的集合: 课程有很多讲座 讲座有很多问题 问题有很多答案 我想要一页,在那里我可以显示给定课程的讲座、问题和答案。我可以显示课程的讲义没有问题,但是我在显示更多嵌套项方面有问题。理想情况下,我想要: 讲座已经开始了 答案已被删除(但未被删除) 问题有答案(但不是讲师ID或课程ID) 这是明智的还是我应该在所有子组件中嵌入CourseID和讲师ID?这是我的iron router,我试图扩展与嵌套带问题的讲座相同的想法,但我遇到了一个绊脚石,即
Router.route('/courses/:_id', {
name: 'CoursePage',
waitOn: function(){
return [
Meteor.subscribe('singleCourse', this.params._id),
Meteor.subscribe('lectures', this.params._id),
Meteor.subscribe('questions', this.params._id)
];
},
data: function() {
return Courses.findOne(this.params._id);
}
});
这是课程页面的订阅,同样是我的绊脚石,我不知道如何在课堂上输入内容:
Template.CoursePage.helpers({
Lectures: function() {
return Lectures.find({courseId: this._id});
},
Questions: function(lectureId) {
return Questions.find({courseId: this._id, lectureId: lectureId});
}
});
有谁能推荐一个好方法来为一个页面进行4级嵌套吗?我认为我遗漏了一些明显的东西,但我找不到谷歌搜索的好例子
谢谢 Mongo可以支持使用聚合。将允许您像SQL连接一样在集合之间连接和收集数据 在meteor中使用它需要使用一个外部mongo(从mongo 3.2开始查找是新的,meteor的mongo仍然是2.6.7)和一个包,比如包。还有其他软件包可以解决这个问题,正如在评论中提到的,聚合就是我所使用的;使用它,您可以根据mongo聚合文档调用
Courses.aggregate(…)
,以生成所需的数据
在我的使用中,我定义了一个Meteor方法,该方法将过滤器参数作为参数
'aggregateReport':function(filterPersonnel, filterCourse, filterQuarter){
return Personnel.aggregate([{$match: filterPersonnel}, {$unwind: "$courses"},
{$lookup: {from: "courses", localField: "courses", foreignField: "_id",
as: "course_docs"}}, {$unwind: "$course_docs"}, {$match: filterCourse},
{$match: filterQuarter}]);
人员有:国家、课程日期、姓氏、全名、…、课程#、课程。(省略号包括与查询无关的内容)。以上内容根据过滤器查询人员,将其输出到每个课程的一条记录(这是程序中许多人的成绩单类型视图),然后将课程中的信息作为课程文档添加到返回的人员中,然后根据课程参数和日期参数进行过滤。代码和依赖关系为meteor 1.2;2016年2月您可以为此打包。请参阅以下示例代码,并根据集合模式进行编辑
Meteor.publishComposite('singleCourse', function (courseId) {
return [{
find: function() {
return Courses.find({ id: courseId});
}
}, {
find: function() {
return Lectures.find({ courseId: courseId});
},
children: [{
find: function(lecture) {
return Questions.find({ lectureId: lecture.id });
},
children: [{
find: function(question) {
return Answers.find({ questionId: question.id });
}
}]
}}
}]
});
然后在路由器中,您只需拨打一个订阅电话
Router.route('/courses/:_id', {
name: 'CoursePage',
waitOn: function(){
return [
Meteor.subscribe('singleCourse', this.params._id)
];
},
data: function() {
return Courses.findOne(this.params._id);
}
});
这是迄今为止最好的包之一(如果不是最好的话),它可以反应性地发布来自不同集合的一组相关文档
在进行此类反应式连接时,存在一些已知问题,但对于较小的数据集,这不会产生任何问题
希望有帮助。使用智能发布
软件包怎么样?它可以帮助连接。这工作非常出色,我可以看到带有问题的项目。findOne()如我所料,非常感谢!最后一个问题,在blaze模板中,如果我说{{{each teachments}},然后在其中嵌套{{{{each Questions}},我如何将参数反馈给Questions订阅?我尝试了{{#每个问题的讲师id=../\u id}}但没有成功。如果它有帮助,你可以投票表决,如果它解决了你问题中的问题,你可以接受它作为答案。至于你的另一个问题,我不太确定,但你可以试试{{{{see Questions-讲师id=\u-id}}
,因为你仍然在讲师
数据上下文中。但正如我所说,我不太确定你能举个例子吗?