我目前正面临 MongoDB 的问题,这可能是由于我的架构设计,但我不确定如何去做。
所以基本上我有这个集合(猫鼬模式):
const PlayerStatsCollection = {
sportType: MongoId,
player: MongoId,
match: MongoId,
team: MongoId,
date: Date,
league: MongoId,
results: {
_id: MongoId,
value: String,
name: String
}
};
结果 Arrya 在这里用作键值字典,其中键是_id。换句话说,所有文档都将共享那些子文档_id(这些是由客户端生成的)
此集合可以并且将具有相同(球员、球队、比赛、联赛、运动类型)组合的多个结果。因此,在查询时,我需要按这些属性(或其中的一个子集)对数据进行分组,并且我需要对每个结果的值求和
我可能在这个集合中有数百万条记录
示例: 因此,如果我有两条玩家 = 0 的记录,并且我想查询该玩家的统计信息,我将只得到一个结果,结果数组被“合并”并且值由值键 (result._id) 求和.
{
$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 对(玩家,...,result._id)?当前的解决方案需要我为每个结果多次查询数据库。_id; 有关我要完成的工作的更多信息:
PlayerStatsCollection 具有根据存储在结果数组中的一组可能发生的事件的数据。我想使用这些事件根据一组标准计算排名。例如,我希望能够查询在给定日期范围内谁是最高(事件类型)的玩家。我还希望能够查询在特定日期范围内谁是最高(事件类型)和团队 x 的最高玩家。
我还考虑创建一个辅助集合(例如 mapReduce)来将排名存储在一个单独的集合中,但我没有看到这将如何支持我需要的那种查询。
我不想要一个完整的解决方案,而只是关于如何设计/解决这个问题的一些指示,也许我遗漏了一些东西或者我的思维过程中有一些我没有注意到的缺陷。
欢迎任何建议。