Meteor发布 - 复合和嵌套集合

时间:2015-06-10 01:13:30

标签: javascript mongodb meteor mongodb-query

我正在尝试构建一个在Meteor中拥有多对多关系的应用。将有工作,客户和用户集合。客户端可以有多个作业,最重要的是,多个用户可以在同一个作业上工作。

我在我的灯具文件中设置了如下作业集:

Jobs.insert({
  jobNum: 'Somejob',
  clientId: 'XXXXXXXX',
  clientName: 'Some Client',
  rate: XX,
  userNames: [
    {userId: user1._id},
    {userId: user2._id}
  ],
  active: true
});

我是根据publish-composite的自述文件发布的,但我无法让用户发布到客户端。这是出版物代码:

Meteor.publishComposite('jobsActive', {
  find: function() {
  // Find all active jobs any client
  return Jobs.find({active: true});
  },

  children: [
    {
     find: function (job) {
        // Return a client associated with the job
        return Clients.find({_id: job.clientId}); 
    }
    },
    {
     find: function (job) {
        // Return all users associated with the job
        // This is where the problem is
        return Meteor.users.find({_id: job.userNames.userId});
     }
   }
 ]
});

我无法弄清楚如何正确查找数组。我尝试了很多东西,没有任何效果。这可能吗?或者我需要以另一种方式解决这个问题吗?我已经考虑过在用户集合中引用作业,但是会有比用户更多的作业,所以它似乎更有意义。

顺便说一下,我也订阅了'jobsActive'。另外两个系列正好向客户端转发;我只是无法让用户集合发布。

感谢您的帮助和想法。

2 个答案:

答案 0 :(得分:2)

您的收藏中不存在

job.userNames.userIdjob.userNames是一个对象数组,其中包含键userId

尝试类似_.map( job.userNames, function( users ){ return users.userId } )的内容。

您的代码将是:

Meteor.publishComposite('jobsActive', {
    find: function() {
        return Jobs.find({active: true});
    },
    children: [
        {
            find: function (job) {
                return Clients.find({_id: job.clientId}); 
            }
        },
        {
            find: function (job) {
                return Meteor.users.find({ _id: { $in: _.map( job.userNames, function( users ) { return users.userId } ) } });
            }
        }
    ]
});

答案 1 :(得分:0)

我认为您根本不需要发布复合,请尝试使用此代码段。这个对我有用!

next()