首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Meteor/Mongodb -数组、子文档和重叠订阅

Meteor/Mongodb -数组、子文档和重叠订阅
EN

Stack Overflow用户
提问于 2016-11-30 13:03:28
回答 2查看 111关注 0票数 1

我在做一场游戏,球员们组成联盟,进行竞争预测。联盟看起来是这样的:

代码语言:javascript
复制
{ leagueName: "Premier League", 
players:[ 
         {name: "Goodie", secretPrediction: "abc"}, 
         {name: "Baddie", secretPrediction: "def"} 
        ] }

对于每个球员,我需要向客户公布联盟中所有球员的名字,但是只是他们自己的秘密预测。因此,从上面看,如果Goodie登录,关于微型mongo的文档应该是:

代码语言:javascript
复制
{ leagueName: "Premier League", 
  players:[ 
           {name: "Goodie", secretPrediction: "abc"}, 
           {name: "Baddie"} 
          ] }

要做到这一点,我有两个出版物-一个获得整个联盟文件,但不包括所有的秘密预测,和一个获得当前球员的子文档在球员数组,包括她的秘密预测。我的出版物是:

代码语言:javascript
复制
// 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"}}}})

问题是,当我订阅的上述出版物时,我没有得到我想要的文档--即使是第二次发布,秘密预测也被排除在外。(就他们自己而言,这些出版物的表现与预期一样,只有在我同时订阅这两种出版物时才能做到。)

现在,我从这个答案了解到,这两个出版物应该在客户机上“合并”。

顶级字段()级别,Meteor注意在文档之间执行一组合并,这样订阅就可以重叠--将不同的顶级字段并行发布到客户端,在客户端上,集合中的文档将是这两组字段的合并。

因此,我有两个主要问题(做得好/谢谢你这么远!):

  1. 文档的合并是不是因为我没有处理顶级字段而没有发生呢?有办法绕道吗?
  2. 我是不是完全搞错了?有更好的方法来获得我想要的结果吗?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-30 14:14:33

您是否可以重新安排数据文档,以便可以使用单个查询?

代码语言:javascript
复制
{ leagueName: "Premier League", 
players:[ 
         {name: "Goodie"}, 
         {name: "Baddie"} 
        ] 
playerPredictions:[ 
         {name: "Goodie", secretPrediction: "abc"}, 
         {name: "Baddie", secretPrediction: "def"} 
        ] 
}

这样,就可以在一个查询中返回给定人员的所有参与者,并且只返回playerPrediction。

票数 2
EN

Stack Overflow用户

发布于 2016-11-30 14:33:25

  1. 是的,Meteor的合并多个订阅只适用于顶级字段,在Meteor:Meteor.subscribe中有提到
  2. 我不能说你走错了方向,这真的取决于你的情况,你想帮助什么特点。仅就我自己而言,我会将上面的集合解耦为两个单独的集合。因为球员可以加入许多联赛,联赛可能有很多球员,所以他们的关系是多对多(n-n)。对于这种关系,我们应该将它们分割成两个集合,并使用结合表来反映它们之间的关系。

所以在你的情况下,我会:

联盟收藏:

代码语言:javascript
复制
[{
  _id: 'league1',
  name: 'League 1',
  // ...
}]

玩家收藏:

代码语言:javascript
复制
[{
  _id: 'player1',
  name: 'Player 1',
  // ...
}]

League2Player收藏:

代码语言:javascript
复制
[{
  _id: 'league1palyer1',
  playerId: 'player1',
  leagueId: 'league1',
  secretPrediction: 'abc',
  // ...
}]
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40889117

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档