在这个earlier thread上,我的一些代码完全适用于相关场景。
我想为另一个类似的场景调整相同的代码,我还没理解可能出现的问题。这次我有一个coursemodule
集合,在课程和模块之间有很多:很多关系集合,只存储coursesId
和moduleId
。由于代码工作正常,我只是复制,做了一些修改,并得出了下面的代码:
courses(){
var theslug = FlowRouter.getParam('myslug');
var mySchoolDocs = SchoolDb.findOne({slug: theslug});
var arrayModuleSchools = ModuleSchool.find({schoolId: mySchoolDocs._id});
// Transform the array of document into an array with only the ids
var arrayModuleId = [];
arrayModuleSchools.forEach(function(moduleSchools){
arrayModuleId.push(moduleSchools.moduleId);
});
var coursetoMod = CourseModules.find({}, {moduleId: {$in: arrayModuleId}});
if (coursetoMod) {
coursesArrayIds = [];
console.log(coursetoSchool);
coursetoMod.forEach(function (courseToModules) {
coursesArrayIds.push(courseToModules.coursesId);
});
return Courses.find({_id: {$in: coursesArrayIds}}).fetch();
}
}
具体而言,Modules
集合中仅存在2个模块,其中包含ids - xfLM9DEzhCMYQpQ32 and PTbZQ9cTG9pByFsY2
。 CourseModule集合包含以下文档:
{
"_id" : "iXX4unJZRNcCw9bAm",
"moduleId" : "PTbZQ9cTG9pByFsY2",
"coursesId" : "FbgcdZxADHKRBj98z",
"createdAt" : ISODate("2017-08-25T16:36:17.173Z"),
"userId" : "n5rqFSHbhm7zqADyB"
}
{
"_id" : "RAJJFjqAjGoDeNhko",
"moduleId" : "PTbZQ9cTG9pByFsY2",
"coursesId" : "ESAf6NGpZzXeioecp",
"createdAt" : ISODate("2017-08-25T16:36:17.182Z"),
"userId" : "n5rqFSHbhm7zqADyB"
}
{
"_id" : "8ceuFwZK8Qduo5J5P",
"moduleId" : "xfLM9DEzhCMYQpQ32",
"coursesId" : "KnNj4GLcyMtvF8JmB",
"createdAt" : ISODate("2017-08-25T16:38:15.368Z"),
"userId" : "n5rqFSHbhm7zqADyB"
}
在我登录控制台时,我得到selectorId
未定义:
L ... n.Cursor {collection:LocalCollection,sorter:null,matcher: M ... o.Matcher,_selectorId:undefined,skip:undefined ...} _projectionFn: (obj)_selectorId:undefined_transform:nullcollection: LocalCollectionfields:undefinedlimit:undefinedmatcher: Minimongo.Matcherreactive:trueskip:undefinedsorter:null__proto__: Object_depend :( changers,_allow_unordered)_getCollectionName: ()_ getRawObjects :( options)_publishCursor:(sub)构造函数: (集合,选择器,选项)count :()fetch :()forEach :(回调, thisArg)getTransform :()map :( callback,thisArg)观察: (选项)observeChanges :(选项)倒带:() proto :对象 view.js:30 L ... n.Cursor {collection:LocalCollection,sorter:null,matcher:M ... o.Matcher,_selectorId:undefined,skip:undefined ...}
我想要做的就是通过模块获取当前显示的特定学校附带的课程。
答案 0 :(得分:1)
您正在以错误的方式使用find
功能:
var coursetoMod = CourseModules.find({}, {moduleId: {$in: arrayModuleId}});
find()
函数有两个参数:myCollection.find(query, projection)
。按字段过滤文档时,它必须位于query
参数内。 projection
参数用于选择要返回的字段。
在您的情况下,您可以使用以下参数:query: {}
和projection: {moduleId: {$in: arrayModuleId}}
。但它必须是:query: {moduleId: {$in: arrayModuleId}}
所以你必须使用$in
作为第一个参数:
var coursetoMod = CourseModules.find({moduleId: {$in: arrayModuleId}});
顺便说一句,如果您想直接查看find
内console.log
函数返回的文档,请使用.fetch()
:
var coursetoMod = CourseModules.find({moduleId: {$in: arrayModuleId}}).fetch();
MongoDB查找功能文档:https://docs.mongodb.com/manual/reference/method/db.collection.find/
答案 1 :(得分:1)
@gaetan在答案的正确轨道上,您需要使用查询参数而不是投影参数。使用与Meteor一起打包的underscore库,您的代码中还可以进行一些其他简化。
courses() {
const slug = FlowRouter.getParam('myslug');
const schoolId = SchoolDb.findOne({ slug })._id;
const Modules = ModuleSchool.find({ schoolId });
const ModuleIds = _.pluck(Modules,'moduleId');
const coursetoMod = CourseModules.find({ moduleId: { $in: ModuleIds }});
if (coursetoMod.length) {
coursesIds = _.pluck(coursetoMod,'coursesId');
return Courses.find({ _id: { $in: coursesArrayIds }}).fetch();
}
}