2016-03-24 4 views
0

У меня Монго документ в следующем формате:Связывание пользователей по идентификатору в Метеоре публиковать

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 
     } 
    } 
} 

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

ответ

1

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

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: списке.

+0

Как получить доступ к этим дочерним данным? Я регистрирую коллекцию на консоли Chrome, и я не вижу никакого нового массива, в котором это было бы. – Henry

+0

Как, код строит, но я не вижу никаких новых данных, отправленных клиенту. – Henry

+0

На клиенте вы увидите дополнительные документы в коллекции 'Meteor.users', но только с запрошенными вами полями. Нет отдельного массива. –