2016-08-03 114 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

這正是發生的情況。謝謝你的摘錄! –

相關問題