我有两个使用mongo集合查询的流星函数。
UI.registerHelper('studentsInCourse', function() {
var courseID = Router.current().params.courseID;
let userIdArray = Enrollment.find(
{ CourseID: courseID}
).map((e) => { return e.UserID});
console.log(userIdArray); //this array correctly has multiple objs in it
var userArray = Meteor.users.find(
{ _id: { $in: userIdArray }}).map((c) => { return c });
console.log(userArray);
return userArray;
}),
Template.registerHelper('course_list', function(){
let courseIdArray = Enrollment.find(
{ UserID: Meteor.userId(), EducatorFlag: false },
{ fields: { CourseID: 1 }}).map((e) => { return e.CourseID });
return Courses.find(
{ _id: { $in: courseIdArray }}).map((c) => { return c });
})
course_list函数正常工作,并返回Courses集合中的Course对象列表。但是,当我记录userIdArray时,studentsInCourse函数正确打印出一个数组,但它只将一个用户对象放入userArray。这恰好对应于userIdArray中最后一个对象的_id。这些功能看起来与我完全相同,我不明白为什么它们会以不同的方式返回。
答案 0 :(得分:1)
取自Meteor API文档的Meteor.users部分:
与所有Mongo.Collections一样,您可以访问服务器上的所有文档,但只有客户端可以使用服务器专门发布的文档。
如果您已登录并从客户端调用以下内容
Meteor.users.find({
_id: {
$in: userIdArray
}
}).map((c) => { return c });
然后默认情况下Meteor.users.find()
只会返回您登录的用户详细信息(这是一项安全功能 - 您不希望人们能够获取所有用户的列表)。所以你的光标最多只能引用一个用户。如果您的登录用户_id
位于userIdArray
中,那么您将仅在该用户上运行关联的map
函数,这就是您只返回一个用户对象的原因。
如果要对客户端的所有用户运行此操作,那么您将需要设置自己的订阅/发布,以便将您想要的用户数据发送到客户端(或者考虑利用Meteor Methods来实现类似的东西 - 你可以创建一个方法来查找并返回所有匹配的用户。)