我目前正在尝试建立一个体育网站,人们可以在该网站上就某个球员可能在一场比赛中胜过另一名球员进行投票。它将以网球为中心,所以比赛全都是1:1,但是我遇到的问题是根据用户数据集汇总结果。
我目前正在使用MongoDB,而且我几乎是一个初学者。我对最终结果的目标将是诸如计算每个玩家的每个匹配项的每种投票类型的总数(哇)。因此,为了做到这一点,我注意到聚合框架似乎是我应该使用的工具。话虽这么说,我终于成功实现了我打算要做的事情,但是我想知道是否有比最终使用“更好”的方法来使用聚合工具。让我解释一下,这是我的用户集合中单个用户的正常结构:
{
name: 'something',
players: {
federer: {
mannarino: -2,
seppi: 1
}
mannarino: {
federer: 2,
seppi: 2
}
seppi: {
federer: -1,
mannarino: -2
}
}
}
因此,如您所见,用户可以对每位网球运动员相应地赢得任何比赛的机会进行评分(从-2“高度不同意获胜”到2“高度同意获胜”)
现在,要遍历整个列表以查找每个网球运动员的总数,我需要遍历每个网球运动员,然后再遍历它们各自的交互进行遍历。这是一个双for循环,看起来像:
for each target player {
for each opponent against target player {
Users.aggregate();
}
}
我大大简化了它,因为我现在不在我的主机上,但我的代码还是可以用。如果需要的话,我可以将上面的伪代码替换为实际的代码,以便进一步澄清。
现在,合计结果会计算出target:对手配对中的每种投票(5种投票,介于-2,-1、0、1、2之间),并在最后将其返回,我可以做类似查找互动平均质量的事情。
问题是我的聚合命令运行了很多次。现在,我正在查看数据库中最大的潜在网球运动员大约80名。如果是80,则意味着要运行此功能并根据用户输入数据创建合并的统计信息,我必须进行6400(80 x 80)聚合!现在,就像我说的那样,我仍然是mongodb的初学者,但是运行这么多正常吗?我尝试在计算机上运行它,好像只花了5个网球运动员就花了一段时间(总计25次跑步,总计5 x 5)。
这里是否有更好的方法来使用聚合,或者这真的是我创建统计信息的唯一解决方案吗?有什么方法可以使用聚合来获取整个玩家与其他所有玩家的互动总数,而不是80 ++聚合?
例如,我可以消除两次循环的需要。
for each target player {
Users.aggregate();
}
所以我不需要做6400个聚合,而只需要做80个。我觉得这样会更有效率,但是我不确定如何构造聚合来完成此任务,或者这是否可行聚合框架甚至能够做到。
无论如何,就像我说的那样,我将其构造为“有效”的方式...但是我只是想知道是否有更好的方法可以做到这一点。谢谢。
如果需要进一步说明,请告诉我。