带有数组的Meteor Mongo $ in仅返回最后一个元素

时间:2016-08-03 00:10:33

标签: javascript mongodb meteor

我有两个使用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。这些功能看起来与我完全相同,我不明白为什么它们会以不同的方式返回。

1 个答案:

答案 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来实现类似的东西 - 你可以创建一个方法来查找并返回所有匹配的用户。)