2016-02-25 4 views
0

Я пытаюсь опубликовать коллекцию классов для пользователей, у которых есть accountStatus.isUserAccountActive: true. В моем текущем коде публикуются пользователи, которые активны, но затем все коллекции классов. Может кто-нибудь, пожалуйста, покажите мне, что я делаю неправильно?Meteor - Публикация коллекции по статусу пользователей

Meteor.publish('classList', function (group) { 
    if (Roles.userIsInRole(this.userId, ['is_teacher'], group)) { 
    return [ 
    Meteor.users.find({roles:'is_student', "accountStatus.isUserAccountActive": true}, 
     {fields: { 
     "profile.firstName": 1, 
     "profile.familyName": 1, 
     roles: 1, 
     "accountStatus.isUserAccountActive": 1 
     } 
    }), 
    classes.find({teacherUserId: this.userId}, 
     {fields: { 
     "studentUserId": 1, 
     "class": 1 
     }}) 
    ]; 
    } else { 

    // user not authorized. do not publish secrets 
    this.stop(); 
    return; 

    } 
}); 
+0

Я не вижу ничего очевидного. Трудно сказать, не видя конкретного примера. Можете ли вы опубликовать документ, который опубликован и не может быть, и 'userId', для которого был опубликован документ? Попробуйте записать 'userId' или запустить запрос в сеансе' meteor shell'. – MasterAM

+0

Hi MasterAm. Спасибо, что ответили. Моя интерпретация приведенного выше кода заключается в том, что он публикует пользователей, в которых пользователи «accountStatus.isUserAccountActive»: true, а затем публикует все коллекции классов. Коллекция классов не зависит от коллекции выше. Я думаю, что мне нужен оператор if, который говорит, если '' accountStatus.isUserAccountActive ": true", то опубликуйте все эти учетные записи. – bp123

+0

Вы хотите публиковать классы, в которых идентификатор 'teacherUserId' является идентификатором текущего пользователя, а' studentUserId' принадлежит пользователю с статусом 'accountStatus.isUserAccountActive'' 1'? Если это так, то вы пытаетесь выполнить так называемое 'join', и это точка боли в MongoDB. Это нелегко сделать. Вы можете либо де-нормализовать данные (и затем синхронизировать их по мере их изменения), либо выполнить соединение вручную на клиенте (показать класс, если вы можете найти пользователя и учетную запись пользователя активным), используйте пакет, такой как как «publish-composite» или агрегация MongoDB. – MasterAM

ответ

1

Я считаю, что это должно получить, что вы хотите:

Meteor.publish('classList', function (group) { 
    if (Roles.userIsInRole(this.userId, ['is_teacher'], group)) { 
    var users = Meteor.users.find({roles:'is_student', "accountStatus.isUserAccountActive": true}, 
     {fields: { 
     "profile.firstName": 1, 
     "profile.familyName": 1, 
     roles: 1, 
     "accountStatus.isUserAccountActive": 1 
     } 
    }); // Get active students. 

    // Get the user ids of active students. 
    var userIdsWhoAreActive = users.fetch().map(function(user) { 
     return user._id; 
    }); 
    return [ users, 
    classes.find({teacherUserId: this.userId, studentUserId: { $in: userIdsWhoAreActive }, 
     {fields: { 
     "studentUserId": 1, 
     "class": 1 
     }}) 
    ]; 
    } else { 

    // user not authorized. do not publish secrets 
    this.stop(); 
    return; 

    } 
}); 

В английском языке, я думаю, что второй запрос гласит: «Принеси мне все классы, где teacherUserId является идентификатор текущего пользователя и studentUserId находится в массиве активных ученических пользователей »

+0

Отлично. Спасибо, Стивен. Я не уверен, есть ли недостаток в этом, основываясь на комментариях MasterAM, но, похоже, он работает. Спасибо, кучи! – bp123

+0

Я считаю, что недостатком является то, что при добавлении пользователей он не будет реагировать на обновление курсора классов, но я не могу себе представить, что он будет часто возникать. –

+0

Ах, хорошо. Благодарю. Он будет делать то, что я делаю. Спасибо, agian! – bp123

Смежные вопросы