Используйте курсор Монго для создания списка с другим запросом
У меня есть две коллекции монго.
Зачисление:
{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 ответ
У вас есть несколько вариантов:
- Используйте курсор непосредственно с
.forEach()
- использование
.fetch()
чтобы превратить курсор в массив объектов, а затем манипулировать этим. - Получить массив
_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 });