做1:很多:许多人加入mongodb

时间:2017-08-27 22:16:28

标签: arrays mongodb meteor find meteor-blaze

在这个earlier thread上,我的一些代码完全适用于相关场景。

我想为另一个类似的场景调整相同的代码,我还没理解可能出现的问题。这次我有一个coursemodule集合,在课程和模块之间有很多:很多关系集合,只存储coursesIdmoduleId。由于代码工作正常,我只是复制,做了一些修改,并得出了下面的代码:

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 ...}

我想要做的就是通过模块获取当前显示的特定学校附带的课程。

2 个答案:

答案 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}});

顺便说一句,如果您想直接查看findconsole.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();
  }
}