MongoDB - 数据库设计和统计数据计算的问题

时间:2018-01-02 10:09:22

标签: mongodb database-design mongoose nosql nosql-aggregation

我目前面临MongoDB的问题,这可能是由于我的架构设计,但我不确定如何去做。

所以基本上我有这个集合(mongoose Schema):

const PlayerStatsCollection = {
  sportType: MongoId,
  player: MongoId,
  match: MongoId,
  team: MongoId,
  date: Date,
  league: MongoId,
  results: {
    _id: MongoId,
    value: String,
    name: String
  }
};

结果Arrya在这里作为键值字典,其中键是_id。换句话说,所有文档将共享这些子文档_id(这些是由客户生成的)

这个系列可以并且将会有相同的(球员,球队,比赛,联赛,运动类型)组合的多个结果。因此,在查询时,我需要按照这些属性(或其中一部分)对数据进行分组,我需要对每个结果的值求和

我可能在这个集合中有数百万条记录

示例: 所以,如果我有两个记录,其中player = 0,并且我想查询该玩家的统计数据,我只得到一个结果,其中结果数组为“merged”,值为sum key(result._id)。 / p>

 {
        $match: {
          team: args.home
        }
      },
      {
        $group: {
          _id: {
            player: "$player",
            team: "$team",
            rankId: "$results._id"
          },
          value: { $sum: "$value" }
        }
      },
      {
        $group: {
          _id: {
            player: "$_id.player",
            team: "$_id.team"
          },
          stats: { $addToSet: { attribute: "$id.rankId", value: "$value" } }
        }
      }

这有点起作用,但我的问题是如何才能获得具有最高值的前5-10个Max对(player,...,result._id)?当前的解决方案需要我为每个result._id多次查询数据库一次。 关于我想要实现的目标的更多信息:

PlayerStatsCollection具有根据存储在结果数组中的一组事件的数据。我想使用这些事件来根据一组标准计算排名。例如,我希望能够在给定的日期范围内查询谁是具有最高(事件类型)的玩家。我还希望能够在特定日期范围内查询谁是具有最高(事件类型)和团队x的最高玩家。

我还想过创建一个辅助集合(例如mapReduce)来将排名存储在一个单独的集合中,但是我没有看到它如何支持我需要的查询类型。

我不想要一个完整的解决方案,但只是关于如何设计/解决这个问题的一些指示,也许我在思考过程中遗漏了一些东西或者有些缺点我没有注意到。

欢迎提出任何建议。

0 个答案:

没有答案