【发布时间】:2017-04-14 19:41:45
【问题描述】:
我在做游戏;玩家组成联盟并做出相互竞争的预测。联赛是这样的:
{ leagueName: "Premier League",
players:[
{name: "Goodie", secretPrediction: "abc"},
{name: "Baddie", secretPrediction: "def"}
] }
对于每个玩家,我需要向客户端发布联盟中所有玩家的姓名,但只发布他们自己的秘密预测。所以从上面看,如果 Goodie 登录了,mini-mongo 上的文档应该是:
{ 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"}}}})
问题是,当我订阅 both 上述出版物时,我没有得到我想要的文档 - 即使第二个出版物也排除了秘密预测。 (就其本身而言,出版物的行为符合预期,只有当我同时订阅两者时。)
现在,我从this answer 了解到,这两个出版物应该在客户端“合并”
到顶级字段的级别,Meteor 负责在文档之间执行集合并集,以便订阅可以重叠 - 发布将不同顶级字段发送到客户端工作端的函数在客户端和客户端,集合中的文档将是两组字段的并集。
所以我有两个主要问题(做得好/感谢您到此为止!):
- 是否因为我不处理顶级字段而没有合并文档?有没有办法解决这个问题?
- 我是不是完全走错了路?有没有更好的方法来获得我想要的结果?
【问题讨论】:
-
1.正确的。 2. 您可以尝试发布到仅限客户端的“虚拟”集合。
标签: mongodb meteor publish-subscribe subdocument minimongo