Связывание пользователей по идентификатору в 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:
список.