使用 Mongo 游标构建包含另一个查询的列表

Use a Mongo Cursor to build a list with another query

我有两个mongocollections.

报名人数:

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

课程

{_id: String, courseName: String}

我正在尝试在给定用户 ID 时生成课程名称列表。这需要我找到用户注册的所有课程。以下函数 returns 只是用户所在的每门课程的 CourseID。

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

我不确定如何获取此游标,并将其中的每个项目用于 运行 另一个查询并根据输出构建列表。基本上我需要为当前课程中的每个 CourseID 做

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

目标只是打印用户注册的所有课程。

您有多种选择:

  1. 直接用光标使用.forEach()
  2. 使用.fetch()将光标转换为对象数组,然后对其进行操作。
  3. 获取.map()_id个注册数组,直接搜索mongo的$in
  4. 的课程

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

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