2016-08-03 116 views
0

我有两个使用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函数正常工作,并返回Course集合中的Course对象列表。然而,当我登录userIdArray时,studentsInCourse函数正确地打印出一个数组,但它只将一个用户对象放入userArray。这恰好对应于userIdArray中最后一个对象的_id。这些功能看起来和我完全一样,我不明白他们为什么返回不同。

回答

1

从流星API文档的Meteor.users部分摘自:

像所有Mongo.Collections,您可以访问服务器上的所有文件,但只有那些特别是由服务器发布都可以在客户端上。

如果您已经登录,并呼吁从客户端以下

Meteor.users.find({ 
    _id: { 
    $in: userIdArray 
    } 
}).map((c) => { return c }); 

则默认情况下Meteor.users.find()只会返回您登录的用户的详细信息(这是一项安全功能 - 你不会告发”不希望人们能够获得所有用户的列表)。所以你的光标最多只能引用一个用户。如果您登录的用户_id位于userIdArray中,那么您将仅对该用户运行关联的map函数,这就是为什么您只返回一个用户对象。

如果您希望针对客户端的所有用户运行此操作,那么您需要考虑设置自己的订阅/发布以便将想要发送给客户端的用户数据发送出去(或者考虑利用Meteor方法实现类似的东西 - 你可以创建一个方法来查找并返回所有匹配的用户)。

+0

这正是发生的情况。谢谢你的摘录! –