2016-07-28 54 views
1

我有两个mongo集合。使用Mongo光标与另一个查询构建列表

报名:

{UserID: String, CourseID: String, EducatorFlag: boolean} 

课程

{_id: String, courseName: String} 

我试图给出一个用户名时产生courseNames的列表。这需要我去发现,用户在注册的所有课程。下面的函数返回各自当然用户在刚刚CourseID。

var currentCourses = Enrollment.find(
    { UserId: Meteor.userId(), EducatorFlag: false }, 
    { fields: { CourseID: 1 }); 

我不确定如何拍摄这个光标,并使用每个项中运行另一个查询并从输出中构建一个列表。基本上在currentCourses每个CourseID我需要做的

var result = [] 
result += Courses.find({_id: CourseID}, {fields: {_id: 0, courseName: 1}}); 

的目标很简单,打印所有用户在注册的课程

回答

1

您有几种选择:

  1. 使用直接使用光标.forEach()
  2. 使用.fetch()将光标转换为对象数组,然后对其进行处理。
  3. 获取的_id小号入学的阵列.map()和直接搜索与蒙戈的$in

课程让我们只用现在的第一个,因为它是非常简单的:

let courseNames = []; 
Enrollment.find(
    { UserId: Meteor.userId(), EducatorFlag: false }, 
    { fields: { CourseID: 1 }).forEach((e)=>{ 
    let course = Courses.findOne(e.CourseID, { fields: { courseName: 1 }}) 
    courseNames.push(course.courseName); 
}); 

注:当在查询中选择fields您不能混用排除和包含。

获取的_id秒的阵列和使用与$in也是非常简单的:

let courseIdArray = Enrollment.find(
    { UserId: Meteor.userId(), EducatorFlag: false }, 
    { fields: { CourseID: 1 }).map((e)=>{ return e.CourseID }); 

let courseNames = Courses.find(
    { _id: { $in: courseIdArray }}).map((c)=>{ return c.courseName });