2

我正在开发一个纸牌游戏平台,其中包含大量(10,000 多张)纸牌,这些纸牌会根据真实世界的数据动态更新。卡片每天填充/更新一次。

我在基金会有两个基本收藏(除了用户):

1) 数据 - 相同数据字段/参数具有不同数据值的所有单个项目(例如,各种车型及其规格)。我每天从另一个服务器上的 json API 更新这个集合一次,用于另一个目的。

2) 卡片 - 具有唯一 ID 但重复的“打印”卡片是不可能的(因此我们可以拥有 10 张福特福克斯 2010 卡片)。Cards collection 有几个最重要的字段,来自数据收集(型号、品牌、卡片的顶级性能参数)以提供高效的用户卡片浏览,以及一个“dataId”字段,将其链接到数据收集以获取详细信息。集合“卡片”中的卡片应在服务器端插入(“发行”或“打印”)功能/方法,但响应客户端事件(例如新游戏等)。当插入/派发新卡时,它首先从用户表中获取一个唯一的“管理员所有者”,其中用户 _id 为一对一关系,稍后更新以创建所有权。

因此,在客户端,卡片集合就像一个用户“套牌”(所有者是用户的所有卡片)。如果我是正确的,它应该在服务器端写成:

Meteor.publish('cards', function() {
  return Cards.find({"userID":this.userId});
});

这一切都很清楚,到目前为止,Meteor 非常棒,因为它为我节省了几个月的工作!

但是,我不确定:

1)我想要一个客户端数据收集出版物来涵盖客户详细的卡片视图(通过将卡片与数据链接)。它当然应该只包含来自数据收集的所有数据项,以及客户卡集合(“套牌”)中每张卡的详细信息。我认为它是这样的:

Meteor.publish('data', function (dataIds *array with all unique data item ids in client card collection *) {
  return Data.find("dataID":{$in:dataIds);
});

2)我需要一个服务器/客户端方法,通过从“管理员”用户的客户端控制台执行 Meteor.call 方法,使用空/管理员用户从数据项(“创建 10 张新闻福特福克斯 2010 卡”)添加/插入新卡,以及用于更改随机卡所有权的服务器/客户端方法,使其成为客户端卡集合的一部分(“将随机卡投射给用户”)。我会将这些方法放在哪里?如何从客户端控制台访问服务器方法(如果登录了某个管理员用户)?

4) 我需要一种巧妙的方法来处理数据收集的服务器发布/客户端订阅,该数据收集将仅包含来自客户端卡片集合的卡片中使用的数据。我应该使用客户端 minimongo 查询来创建一个数组,其中包含涵盖本地卡片集合所需的所有 dataIds 吗?我是 mongo 的新手,所以我不确定如何编写 SELECT DISTINCT 或 GROUP BY 之类的东西来获得它。另外,不确定这是否是处理该问题的最佳方法,还是我应该在服务器端做一些事情作为出版物?

对 1-4 有一个清晰的想法会让我继续前进,然后我想我会挖掘自己的方式(并在 :)

4

1 回答 1

2

1)您编写的发布功能非常有意义。当然,术语“客户端数据收集发布”有点混淆:发布在服务器端,而在客户端你有订阅。此外,虽然您没有指定您的架构,但我想您在集合中有字段dataIDcards它与集合连接,所以您的 find 应该说._iddata{_id: {$in: dataIds}}

2) 仔细阅读,这就是你所需要的。请记住在服务器端方法中检查用户权限。安全性的经验法则是您永远不应该信任客户端。

3)没有第3点?

4)我不确定这里的问题与 1 有何不同。但是,您可能应该熟悉这种方法,您可以在订阅中使用它以确保_ids数组中的 是唯一的。

于 2013-11-11T13:49:35.770 回答