我目前面临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)来将排名存储在一个单独的集合中,但是我没有看到它如何支持我需要的查询类型。
我不想要一个完整的解决方案,但只是关于如何设计/解决这个问题的一些指示,也许我在思考过程中遗漏了一些东西或者有些缺点我没有注意到。
欢迎提出任何建议。