使用Mongo Cursor与另一个查询构建列表

时间:2016-07-28 04:49:45

标签: javascript mongodb meteor cursor

我有两个mongo系列。

注册:

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

课程

{_id: String, courseName: String}

我正在尝试在给定UserID时生成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 个答案:

答案 0 :(得分:1)

您有几种选择:

  1. 直接将光标与.forEach()
  2. 一起使用
  3. 使用.fetch()将光标转换为对象数组,然后对其进行操作。
  4. 使用_id获取一系列.map()次注册,并使用mongo' s $in
  5. 直接搜索课程

    我们现在只使用第一个,因为它非常简单:

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