Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
meteor中的4级订阅嵌套_Meteor_Meteor Blaze - Fatal编程技术网

meteor中的4级订阅嵌套

meteor中的4级订阅嵌套,meteor,meteor-blaze,Meteor,Meteor Blaze,我正在使用meteor,这是我的模式,每个都是一个单独的集合: 课程有很多讲座 讲座有很多问题 问题有很多答案 我想要一页,在那里我可以显示给定课程的讲座、问题和答案。我可以显示课程的讲义没有问题,但是我在显示更多嵌套项方面有问题。理想情况下,我想要: 讲座已经开始了 答案已被删除(但未被删除) 问题有答案(但不是讲师ID或课程ID) 这是明智的还是我应该在所有子组件中嵌入CourseID和讲师ID?这是我的iron router,我试图扩展与嵌套带问题的讲座相同的想法,但我遇到了一个绊脚石,即

我正在使用meteor,这是我的模式,每个都是一个单独的集合:

课程有很多讲座

讲座有很多问题

问题有很多答案

我想要一页,在那里我可以显示给定课程的讲座、问题和答案。我可以显示课程的讲义没有问题,但是我在显示更多嵌套项方面有问题。理想情况下,我想要:

讲座已经开始了

答案已被删除(但未被删除)

问题有答案(但不是讲师ID或课程ID)

这是明智的还是我应该在所有子组件中嵌入CourseID和讲师ID?这是我的iron router,我试图扩展与嵌套带问题的讲座相同的想法,但我遇到了一个绊脚石,即如何向讲师ID提供订阅:

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}}
,因为你仍然在
讲师
数据上下文中。但正如我所说,我不太确定你能举个例子吗?