我正在尝试在MongoDB中建立一个投票系统.你可以把它想象成一个类似于reddit的投票系统.要求:
投票与对象相关联
检查用户是否对某个对象进行了投票是非常快的.应用程序将需要知道登录用户是否已对对象进行投票,同时它循环通过对象列表呈现投票按钮.
最重要的是,它必须能够以合理的性能检索在给定时间段(最后一小时,一天,一个月等)内按其总分数排序的对象.
应该能够支持每个对象数千票.
我在这里看到两种方法(如果我错了,请纠正我!):
在每个对象中嵌入一系列投票文档.我可能会存储投票用户的ObjectId,投票金额和投票时间.voterId将是投票数组中每个嵌入式投票文档的关键,以允许快速哈希查找.
使用引用对象的投票保留单独的投票集合.
我也想过将投票嵌入到按小时分组的"桶"中的想法.
对于第2号要求,第1号的速度非常快,但我不知道在这种情况下是否可以使用第3号要求.
对于第2号要求,第2号的速度要慢一些,我不确定3号要求/如何实现它的表现会是什么样的(map reduce?).
基本上我似乎需要从第3项要求的合理快速解决方案开始,然后确保要求No 2不会太慢.想法?
使用嵌入式方法.为每个对象添加一个参数,用于每小时得分,每日得分,每月得分等.最近添加另一个布尔参数 - 最近投票,最近每小时和最近每日.创建一个在对象上运行map-reduce的脚本,以计算和更新这些参数.
该脚本将通过cron运行三种变体.
10分钟间隔:计算前一小时得分> 0的对象的小时得分或最近投票=真的对象.运行此脚本后设置recent-voted = false.设置recent-hourly = true.
3小时间隔:计算最近每小时=真的任何对象的每日分数.设置recent-hourly = false.设置recent-daily = true.
24小时间隔:计算最近每日=真的任何对象的每月分数.设置recent-daily = false.
我们的想法是尽量减少对正在运行的分数计算脚本无关的对象的不必要处理(每小时应该只运行自上次每小时运行以来已经投票的对象,或者尚未投票的对象并需要重置为0).另一个好处是*-score值不仅需要根据对象投票计算.例如,您可以包含页面视图,或者其他任何内容.关于这种方法的想法?