使用数组使用 Meteor js 在集合中查找文档
Using array to find documents in a collection using Meteor js
辅助方法
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 Profs 来说,它只是一英寸的冰山,几秒钟后就会被摧毁。我有 3 个集合,一个用于学校记录 (SchoolDb
),第二个用于模块 (Modules),第三个是关系 table (ModuleSchool
)。模块分配给学校。
从上面的代码中,我可以使用传递给我用来从关系 [=32 中获取 schoolId
的路由的 slug 从 (SchoolDb
) 获取学校 _id =] (SchoolDb
) 和 (ModuleSchool
) 到 return 分配给相关学校的模块。我能够获取模块 ID 并将它们转换为数组,我现在想要做的是使用从 ModuleSchool
获取的 ID 数组到 return 模块名称,因为只有 _ids
存储在关系 table.
中
上面的代码只是将 _id 转换为数组,当我尝试在模板上打印时没有任何显示。我有什么错?
要查找其字段对应于数组中至少一个元素的文档,您可以使用 $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>
但是如果每个模块只附属于一所学校,我建议一个更简单的解决方案来解决你的问题,你不必在学校和模块之间创建一个集合。
您只需创建两个集合:Schools
和 Modules
并向模块文档添加一个 schoolId
字段。
那么您的代码将如下所示:
Template.my_template.helpers({
modules(){
var myslug = FlowRouter.getParam('myslug');
var mySchoolDoc = Schools.findOne({slug: myslug});
return Modules.find({schoolId: mySchoolDoc._id}).fetch();
}
});
辅助方法
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 Profs 来说,它只是一英寸的冰山,几秒钟后就会被摧毁。我有 3 个集合,一个用于学校记录 (SchoolDb
),第二个用于模块 (Modules),第三个是关系 table (ModuleSchool
)。模块分配给学校。
从上面的代码中,我可以使用传递给我用来从关系 [=32 中获取 schoolId
的路由的 slug 从 (SchoolDb
) 获取学校 _id =] (SchoolDb
) 和 (ModuleSchool
) 到 return 分配给相关学校的模块。我能够获取模块 ID 并将它们转换为数组,我现在想要做的是使用从 ModuleSchool
获取的 ID 数组到 return 模块名称,因为只有 _ids
存储在关系 table.
上面的代码只是将 _id 转换为数组,当我尝试在模板上打印时没有任何显示。我有什么错?
要查找其字段对应于数组中至少一个元素的文档,您可以使用 $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>
但是如果每个模块只附属于一所学校,我建议一个更简单的解决方案来解决你的问题,你不必在学校和模块之间创建一个集合。
您只需创建两个集合:Schools
和 Modules
并向模块文档添加一个 schoolId
字段。
那么您的代码将如下所示:
Template.my_template.helpers({
modules(){
var myslug = FlowRouter.getParam('myslug');
var mySchoolDoc = Schools.findOne({slug: myslug});
return Modules.find({schoolId: mySchoolDoc._id}).fetch();
}
});