Связывание пользователей по идентификатору в Meteor Publish

У меня есть документ на монго в следующем формате:

Group: {
    participants: [
        userId,
        userId,
        userId
    ]
}

... где userIds, очевидно, являются собственными ObjectIds Метеора для документа пользователя.

Проблема, с которой я действительно сталкиваюсь, заключается в том, что я хочу, чтобы пользователи просматривали другую информацию о пользователях в своей группе. В этой реализации я представляю себе защищенную (читай: я удалил автопубликацию и небезопасную) систему обмена сообщениями в группах.

Моя текущая реализация публикации выглядит так:

//grab all groups user belongs to
Meteor.publish("groups", function() {
    var groups = Groups.find({
        participants: {
            $in: [ this.userId ]
        }
    });
    return groups;
});

Теперь, в идеале, я хотел бы просто реализовать некоторый код для манипулирования groups прежде чем я закончу публиковать его, чтобы также опубликовать каждый участник user.profile данные также. Предполагаемый окончательный формат будет следующим:

Group: {
    participants: {
        userId
    },
    users: {
        {   //One of these for each user
            userId,
            firstName,
            lastName,
            otherData
        }
    }
}

Одна вещь, которую я заметил, заключается в том, что без автоматической публикации и небезопасной работы я не могу просто сделать это на клиенте с помощью вспомогательной функции.

1 ответ

Решение

Это довольно простой пример использования пакета reywood:publish-смесь:

Meteor.publishComposite('groups', {
    find: function() {
        return Groups.find({ participants: { $in: this.userId }});
    },
    children: [
        {
            find: function(group) {
                return Meteor.users.find(
                    { _id: { $in: group.participants },
                    { fields: { firstName: 1, lastName: 1, otherData: 1 }});
            }
        },
    ]
});

Обратите внимание, что пользователи _id поле всегда включено, вам не нужно явно вызывать его в fields: список.

Другие вопросы по тегам