使用数组使用Meteor js查找集合中的文档

时间:2017-08-27 12:25:27

标签: arrays mongodb meteor find meteor-blaze

辅助方法

  GetSchoolId: function () {
            var moduleIdArray=[];
            var myslug = FlowRouter.getParam('myslug');
            var mySchoolId = SchoolDb.findOne({slug: myslug});
            if (mySchoolId) {
                ModuleSchool.find({}, {schoolId: mySchoolId._id}).forEach(function (modulesSelected) {
                    moduleIdArray.push(modulesSelected.moduleId);
                });
                if (typeof moduleIdArray === 'object' && moduleIdArray instanceof Array) {
                    console.log(moduleIdArray);
                    moduleIdArray.forEach(function (moduleIds) {
                        return Modules.find({}, {_id: moduleIds}).fetch();
                    });
                }
            }
        }

模板代码:

{{#each GetSchoolId }} 
    <p>{{GetSchoolId.modulename}} </p>
    {{/each}}
    </p>
{{/each}}

我知道Meteor教授,这是一个冰山一英寸,几秒钟之内就会被摧毁。我有3个集合,一个用于学校记录(SchoolDb),第二个用于模块(模块),第三个是关系表(ModuleSchool)。模块分配给学校。

从上面的代码中,我可以使用传递给路径的slug从(SchoolDb)获取学校_id,我用它从关系表中获取schoolId {{1 }}和(SchoolDb)返回分配给相关学校的模块。我能够获取模块ID并将它们转换为数组,我现在要做的是使用从ModuleSchool获取的Ids数组来返回模块中的模块名称,因为只有ModuleSchool存储在关系表中。

上面的代码只做到了将_ids转换为数组的水平,当我尝试在模板上打印时没有显示任何内容。我错了什么?

1 个答案:

答案 0 :(得分:2)

要查找包含与阵列中至少一个元素相对应的字段的文档,您可以使用$in

Template.my_template.helpers({
    modules(){
        var myslug = FlowRouter.getParam('myslug');
        var mySchoolDoc = SchoolDb.findOne({slug: myslug});
        var arrayModuleSchool = ModuleSchool.find({schoolId: mySchoolDoc._id});
        // Transform the array of document into an array with only the ids
        var arrayModuleIds = [];
        arrayModuleSchool.forEach(function(moduleSchool)){
            arrayModuleIds.push(moduleSchool.moduleId);
        });
        return Modules.find({_id: {$in: arrayModuleIds}}).fetch();
    }
});

然后只需使用{{each}}标记。

<template name="my_template">
  {{#each module in modules}} 
    <p>{{module.modulename}}</p>
  {{/each}}
</template>

但如果每个模块只附加到一所学校,我建议为您的问题提供一个更简单的解决方案,您不必在学校和模块之间创建一个集合。

您只需要创建两个集合SchoolsModules,并在模块文档中添加schoolId字段。

然后你的代码看起来像那样:

Template.my_template.helpers({
    modules(){
        var myslug = FlowRouter.getParam('myslug');
        var mySchoolDoc = Schools.findOne({slug: myslug});
        return Modules.find({schoolId: mySchoolDoc._id}).fetch();
    }
});