Meteor和对同一集合的多个订阅(以及相同的对象)

时间:2015-11-16 02:58:12

标签: meteor coffeescript meteor-publications

我正在使用meteor.js编写一个大型模块化应用程序。在我的应用程序中,我有一个名为" Courses"的集合。课程集合中对象的Schema如下所示:

_id: MongoId
title: String
intro: String
content: Object
settings: Object
    secret: Object
    nonSecrets: Object
members: [Object]
    userId: MongoId
    wantsMail: Boolean
    gotMemberAt: Date

我有几个出版物:

# Publish an overview of all courses, I am Member at
Meteor.publish 'myCourses', ->
     return Courses.find(
           {members:{$elemMatch:{userId: @userId}}},
           {fields:{title:1, intro:1, 'settings.nonsecret':1, 'members.$':1}}
     )

# Single Course Detail
Meteor.publish 'singleCourse', (id) ->
    return Courses.find(
        id, 
        {fields: {title:1, intro:1, content:1, 'settings.nonSecret':1}}
    )

# Admin Information of course
Meteor.publish 'singleCourseAdamin', (id) ->
    return Courses.find(
        id, 
        {fields: {title:1, settings:1, members:1}}
    )

我现在的问题是,当我订阅所有三个出版物时,我不会得到除myCourses出版物之外的其他成员。

是否有任何关于如何发布和订阅同一文档的子集在实际流星版本中工作的文本,以及如果我想让它工作,我需要检查哪些内容?

或者是否有一个软件包可以更容易地限制每个用户对字段的访问?

1 个答案:

答案 0 :(得分:0)

这是known issue。我最近在common mistakes添加了一个关于它的部分(参见" Merge Box")。虽然有一些complicated workarounds,但您最好的选择是:

  1. 重新组织您的数据,以便不需要发布子字段。
  2. 一次只使用一个需要特定子字段的发布商(在这种情况下,您可以在管理员发布商处于活动状态时关闭 <f:selectItem itemLabel="Select One" itemValue="0" noSelectionOption="true" /> 发布商)。这可能很难保证。
  3. 只需发布更多数据(整个字段)。显然,在某些情况下可能不起作用 - 特别是如果存在安全问题。
  4. 另请注意,当第一个和最后一个发布商都处于有效状态时,您应该在myCourses字段中遇到相同的问题。