【问题标题】:Using array to find documents in a collection using Meteor js使用数组在使用 Meteor js 的集合中查找文档
【发布时间】:2018-02-04 21:26:11
【问题描述】:

辅助方法

  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),第三个用于关系表 (ModuleSchool)。模块分配给学校。

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

当我尝试在模板上打印时,上面的代码只执行将_ids 转换为数组的级别,但没有显示任何内容。我有什么错?

【问题讨论】:

  • $in
  • 尼尔伦,谢谢。请根据我的帖子提供有关实施的 sn-p。

标签: arrays mongodb meteor find meteor-blaze


【解决方案1】:

要查找包含与数组的至少一个元素对应的字段的文档,您可以使用$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,然后在 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();
    }
});

【讨论】:

  • 还有什么比这更重要的分数吗?我对这种专业贡献感到非常幸运。它工作得很好..
  • 非常感谢。再次,我复制代码以复制另一个类似的场景,这次课程到模块,令我惊讶的是代码没有显示任何内容,我不知道有什么诀窍。这只是复制并粘贴您的答案。就像复制代码一样。会不会是线程问题?
  • 尝试理解它是如何工作的,检查你在你的助手中返回的值。也许你什么都没有返回,所以它不会打印任何值。不要犹豫,在帮助代码中添加几个console.log(variableToCheck)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-30
相关资源
最近更新 更多