Используйте курсор Монго для создания списка с другим запросом

У меня есть две коллекции монго.

Зачисление:

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

Курсы

{_id: String, courseName: String}

Я пытаюсь сгенерировать список courseNames при указании идентификатора пользователя. Это требует, чтобы я нашел все курсы, в которых зарегистрирован пользователь. Следующая функция возвращает только CourseID каждого курса, в котором находится пользователь.

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

Я не уверен, как взять этот курсор и использовать каждый элемент в нем, чтобы выполнить другой запрос и построить список из вывода. В основном для каждого CourseID в currentCourses мне нужно сделать

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 });
Другие вопросы по тегам