【问题标题】:Linked collections in MeteorMeteor 中的链接集合
【发布时间】:2013-11-23 03:37:27
【问题描述】:

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

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

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

2) 卡片 - 带有唯一 ID 但重复的“打印”卡片是不可能的(因此我们可以拥有 10 张福特福克斯 2010 卡片)。 Cards collection 有几个最重要的字段,来自数据收集(型号、品牌、卡片的顶级性能参数)以提供有效的用户卡片浏览,以及一个“dataId”字段,将其链接到数据收集以获取详细信息。 集合“卡片”中的卡片应在服务器端插入(“发行”或“打印”)功能/方法,但响应客户端事件(例如新游戏等)。当插入/派发新卡时,它首先从 users 表中获取一个唯一的“admin-owner”,其中包含 user _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 卡片”),使用空/管理员用户admin”用户,以及更改随机卡所有权的服务器/客户端方法,使其成为客户端卡集合的一部分(“将随机卡投射给用户”)。 我会将这些方法放在哪里?如何从客户端控制台访问服务器方法(如果登录了某个管理员用户)?

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

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

【问题讨论】:

    标签: meteor


    【解决方案1】:

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

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

    3)没有第3点?

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-30
      • 1970-01-01
      • 2016-02-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-27
      • 1970-01-01
      相关资源
      最近更新 更多