javascript - 使用 Mongo Cursor 通过另一个查询构建列表

标签 javascript mongodb meteor cursor

我有两个 mongo 集合。

报名:

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

类(class)

{_id: String, courseName: String}

我正在尝试在给定用户 ID 时生成类(class)名称列表。这要求我找到用户注册的所有类(class)。以下函数仅返回用户所在的每个类(class)的 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}});

目标只是打印用户注册的所有类(class)。

最佳答案

您有多种选择:

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

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

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

注意:在查询中选择字段时,不能混合排除和包含。

获取 _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 });

关于javascript - 使用 Mongo Cursor 通过另一个查询构建列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38627312/

相关文章:

javascript - 在 Javascript 中将不透明度转换为十六进制

javascript - React Typescript 属性在类型/IntrinsicAttributes 和 IntrinsicClassAttributes 上不存在

javascript - 如何在div中调用远程页面?

mongodb - 更新集合中的大量记录

python - 使Spark,Python和MongoDB协同工作

javascript - 追踪器 : why remove computation when invalidated?

jquery - 使用jquery将类添加到 meteor 中的当前目标事件

javascript - 将集合映射到对象

mongodb - 通过 numactl 作为守护进程启动 mongodb

javascript - 使用 Meteor-Roles 有哪些优点和缺点?