2016-11-30 51 views
1

我正在做游戏;球员组成联盟并进行竞争性预测。联赛是这样的:流星/ MongoDB的 - 阵列,子文档&重叠订阅

{ leagueName: "Premier League", 
players:[ 
     {name: "Goodie", secretPrediction: "abc"}, 
     {name: "Baddie", secretPrediction: "def"} 
     ] } 

对于每一个球员,我需要发布到客户端的所有球员的名字在联赛,但只自己的秘密预测。因此,从以上,如果礼包已登录,在微型蒙戈的文件应该是:

{ leagueName: "Premier League", 
    players:[ 
      {name: "Goodie", secretPrediction: "abc"}, 
      {name: "Baddie"} 
      ] } 

要做到这一点,我有两个刊物 - 一个让整个联赛的文档,但不包括所有秘密的预言,和一个得到当前玩家的玩家阵列中的子文档包括她的秘密预测。我的出版物有:

// Publish whole players array excluding secretPrediction 
Leagues.find({"players.name": "Goodie"}, {fields: {"players.secretPrediction": 0}}) 

// Publish the whole Goodie item in the players array and nothing else 
Leagues.find({"players.name": "Goodie"}, {fields: {players: {$elemMatch: {name: "Goodie"}}}}) 

的问题是,当我订阅上述出版物,我没有得到我想要的文件 - 秘密预测被排除在外,即使与第二次公开。 (对自己的刊物像预期的那样,只有当我订阅两者。)

现在,我从this answer明白,这两个刊物应该是客户端

下到上“合并”的顶级域水平,流星照顾到文档中执行一组工会,这样订阅可以重叠 - 发布由端和客户船舶不同顶级域的客户工作方面的功能,在文档中收集将是两套领域的结合。

所以,我有两个主要问题(制作了这一步,做得很好/谢谢!):

  1. 是不会发生,因为我没有处理顶级域的文档工会?有没有解决的办法?
  2. 我要对这个完全错误的方式?有没有更好的方法来获得我想要的结果?
+1

1.正确。 2.你可以尝试发布到只有客户端的“虚拟”集合。 – MasterAM

回答

2

你能代替重新排列的数据文件,这样就可以使用例如单查询

{ leagueName: "Premier League", 
players:[ 
     {name: "Goodie"}, 
     {name: "Baddie"} 
     ] 
playerPredictions:[ 
     {name: "Goodie", secretPrediction: "abc"}, 
     {name: "Baddie", secretPrediction: "def"} 
     ] 
} 

这样就可以在单个查询中返回给定人员的所有玩家并且只返回playerPrediction。

+0

接受此作为答案,因为我认为这是最简单和最快捷的方式来获得结果我需要 – rubie

3
  1. 是,流星的合并多个预订只能用顶级域的作品,它是在流星文档中提到:Meteor.subscribe

  2. 我不能说,你正在走向错误的方向,这真的取决于你的情况,你想要帮助什么功能。只谈到我自己,我会把上面的集合分解成两个独立的集合。因为玩家可以加入很多的联赛和联赛可能有很多球员,所以他们的关系是many-to-many (n-n)。对于这种关系的,我们应该将它们拆分到两个集合,并使用associative table,以反映它们之间的关系

你的情况

所以,我会:

联赛集合:

[{ 
    _id: 'league1', 
    name: 'League 1', 
    // ... 
}] 

玩家收集:

[{ 
    _id: 'player1', 
    name: 'Player 1', 
    // ... 
}] 

League2Player集合:

[{ 
    _id: 'league1palyer1', 
    playerId: 'player1', 
    leagueId: 'league1', 
    secretPrediction: 'abc', 
    // ... 
}] 
+0

文档中的好处 - 我没有看到该评论。而且 - “我们希望在未来的版本中解除这个限制。” - 希望不久... – rubie