在通过发布复合发布之前,有效地过滤数组中的多个项目

时间:2016-02-17 15:00:39

标签: javascript mongodb meteor

我非常喜欢将{ _id: "1234", guilds: [ { slug: 'ascension' }, { slug: 'warlords-of-draenor' }, { slug: 'archers-anonymous' } ] } 用于我所拥有的非常复杂的出版物。但是,我有一个需要过滤数组的情况。必须将数组筛选为仅当前用户和已发布用户都属于的角色。示例文档:

Meteor.publish('player', function (id) {
  check(id, String);

  const allRoles = Roles.getAllRoles().map(role => role.name);
  const handle = Meteor.users.find(id).observe({
    added: doc => {
      doc.guilds = doc.guilds.filter(guild => Roles.userIsInRole(this.userId, allRoles, guild.slug));
      this.added('users', doc._id, doc);
    }
  });
  this.ready();
  this.onStop(() => handle.stop());
});

如果我要正常发布播放器,我可以为光标执行以下操作。

{{1}}

问题是,我不认为我可以将它与发布复合集成,因为它不会返回光标以传递给子节点。

是否有解决方案可以在将文件传递给孩子之前更改文件?

1 个答案:

答案 0 :(得分:0)

有时我的查询/过滤器选项很复杂,我经常将它插入临时集合,然后从中查询和发布。 在你的情况下,我认为你可以尝试将结果插入临时收集,如guild-temp。

Meteor.publish('player', function (id) {
   check(id, String);

   const allRoles = Roles.getAllRoles().map(role => role.name);
   const handle = Meteor.users.find(id).observe({
       added: doc => {
       doc.guilds = doc.guilds.filter(guild => Roles.userIsInRole(this.userId, allRoles, guild.slug));
       this.added('users', doc._id, doc);
   }
   //insert handle result to temp-collection
   TempCollection.insert(handle...);
   return TempCollection.find(condition)...
   this.ready();
   this.onStop(() => handle.stop());

});