微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在“流星/蒙古”中“更改”已发布的字段集

如何解决如何在“流星/蒙古”中“更改”已发布的字段集

有人知道如何根据记录的某些特征/字段值(相对于已登录用户)“更改”发布(Meteor.publish或Meteor.publishComposite)中的字段集吗?

我使用的是publishComposite,光标处于同一级别,就像这样:

Meteor.publishComposite("games",[
  {
    find: userRecord,children: [
      {
        find: gamesWeArePlaying
      }
    ]
  },{
    find: userRecord,children: [
      {
        find: gamesWeOwn
      }
    ]
  },children: [
      {
        find: examineWithAnalysis
      }
    ]
  },children: [
      {
        find: examineWithoutAnalysis
      }
    ]
  },children: [
      {
        find: allGames
      }
    ]
  }
]);

每个find函数都返回一个带有限定记录的游标,并以该状态允许该用户使用的字段集。请注意,在每个子级查找中,它将找到一组唯一的记录,但是它返回的字段特定于该游标。最常见的是从“ gamesWeArePlaying”到“ examineWithAnalysis”的转换,对于老师/学生,是从“ examineWithAnalsyis”到“ examineWithoutAnalysis”的转换。

但是发生的事情是,当游戏(即,一条记录)从一个游标过渡到另一个游标时,底层框架无法将正确的“已更改”字段发送给客户端。 minimongo记录完全可以解决,甚至与服务器数据库中的实际记录都不匹配。

因此,我的问题是:以一种反应方式返回一组记录的最佳方法是什么,其中每个记录都基于所述记录的特性返回了一个特定的字段集?

解决方法

我通读了您的github代码,看来您的真实意图是发布该用户应具有“访问权”的所有游戏,并且您希望用户对每个游戏具有不同的权限。这更像是mongodb解决方案,您想在第一次获取用户ID的地方进行常规发布(不是复合发布,它们运行缓慢并且运行不正常)。然后只需要像这样查询所有游戏(因为您已经是综合游戏)

{
  $or : [
    { isolation_group : user.isolation_group },// part of the user's isolation group
    { owner           : user._id }              // games we own
  ]
}

这应根据用户的隔离组或所有权检索用户应拥有的所有游戏。我建议甚至将isolation_group添加到您拥有的游戏中,以简化查询-但这是可选的。检索完所有这些游戏后,将它们放入一个数组中,在这里可以找到lodash之类的库-您可以像这样进行一系列_.map()的调用

let gamesWeArePlaying = _.compact(_.map(ArrayOfAllGames,(game,key) => {
  if (game.status !== "playing" || 
        (game.white.id !== user._id && game.black.id !== user._id)) {
    return '';
  }

  return _.pick(game,[
    "black","clocks","fen","lag","observers","pending","rated","rating_type","startTime","status","tomove","variations","white","wild"
  ]);
}));

在这里变得有些棘手,如果您将您在this.added/changed/removed中提到的内容发布到相同的client side collection,则势必会获得相同的游戏,但是您想要展示特定的游戏多个_.map()调用的结果为基础的字段。如果您多次添加相同的游戏,Meteor将使用不同的权限多次发布相同的游戏,这不是您想要的。因此,请修改该映射调用,以实际上一次检查所有权限(例如,gamesWeArePlaying,gamesWeOwn,expectWithAnalysis等),然后根据此字段更改_.pick()字段列表。这将为您提供统一的游戏阵列,其中包含要发布的适当字段,这些字段将进行动态更新。

,

好的,我知道了,那对我来说是一个愚蠢的程序员错误。首先,让我说一下publishComposite和更改字段(排除性能问题)实际上是可行的!这样的事情确实有用:

publishComposite("publication",{
   find() {return collection1.find()},children: [
      {find(c1_record) {return collection2.find({s1},{fields: {f1: 1}})}}
      {find(c1_record) {return collection2.find({s2},{fields: {f1: 1,f2: 1}})}}
      {find(c1_record) {return collection2.find({s3},{fields: {f2: 1}})}}
   ]
});

与Mongo,Meteor,DDP,客户端或minimongo无关。效果很好。

我的问题是,当使用更高级别的查找不用于发布,而仅用于不合格的记录时,使用publishComposite时必须非常小心。让我们用我的例子。在上面,我正在发布游戏记录,并根据某些状态(如果您正在玩游戏,是否可以看到计算机分析等信息)来发布某些字段。

但是,在其他地方,我必须发布聊天记录。为了正确发布聊天记录,我必须弄清楚用户正在玩或观察哪些游戏。他们是在玩游戏还是可以看到计算机分析都无关紧要。我只需要知道他们正在玩哪些游戏。所以我这样做了:

publishComposite("chat",{
find() {
  return Meteor.users.find({_id:...})
},children[
  {
    find() {return gamescollection.find({..all games user is involved with...})},children: [{
      find(){
        chat.find({...chats for game...})}
    }]
  }
]
});

看到问题了吗?

最高级别的发现 发布 用户记录,其所有字段的所有荣耀(可能是问题#1!)

第二级查找 发布 游戏记录,记录所有领域。我的朋友们,那就是问题所在。我之所以没有将它们放在一起,是因为我不是故意发布用户或游戏,而只是为了提供必要的数据以在最低级别发布聊天记录。

我更改了后一个出版物,以仅返回用户所涉及的游戏记录的ID(即gamescollection.find({...},{fields: {_id: 1}}),就这样,一切正常。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。