首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在MongoDB中建模投票系统的最佳方法

在MongoDB中建模投票系统的最佳方法
EN

Stack Overflow用户
提问于 2011-08-12 13:22:00
回答 2查看 3.1K关注 0票数 13

我试图在MongoDB中建立一个投票系统。你可以想象它是一个类似于reddit的投票系统。要求:

  1. 选票与对象相连。
  2. 检查用户是否对对象进行投票是非常快速的。应用程序需要知道登录用户是否对一个对象进行投票,而它循环遍历呈现投票按钮的对象列表。
  3. 最重要的是,它必须能够在给定的时间段(最后一小时、日、月等)内检索按其累计分数排序的对象,并具有合理的性能。
  4. 应该能够支持每一个目标的数千张选票。

我在这里看到两种方法(如果我错了,请纠正我!):

  1. 在每个对象中嵌入一个投票文档数组。我可能会存储投票用户的ObjectId、投票量和投票时间。voterId将是选票数组中每个嵌入的投票文档的关键,以便快速进行哈希查找。
  2. 使用引用对象的选票保存单独的选票集合。

我还玩过把选票嵌入到一个单独的集合中按小时分组的“水桶”中的想法。

第一条对于第二项要求来说是非常快的,但我不知道在这种情况下第三项要求是否可行。

对于第二项要求,第二项的速度要慢一些,我不知道第三项要求的表现如何/如何实现(地图减少?)

基本上,我似乎需要从第3号需求的快速解决方案开始,然后确保第2号需求不会太慢。想法?

势解

采用嵌入式方法。为每个对象添加一个参数,用于小时得分、日得分、月得分等。添加另一个布尔参数最近投票,最近每小时和最近一天。创建一个在对象上运行map-还原的脚本来计算和更新这些参数。

脚本将以三个变体通过cron运行。

  1. 10分钟间隔:计算前一个小时分数>0或最近投票结果为真的对象的每小时得分。在运行此脚本后,最近进行了-抽签= false。设置最近-小时=真。
  2. 3小时间隔:计算最近每小时=真的任何对象的每日得分.设置最近-小时=假。最近-每日=真。
  3. 24小时间隔:计算最近-日=真的任何对象的月得分.设置最近-每日=假。

这样做的目的是最大限度地减少对与正在运行的分数计算脚本无关的对象的不必要处理(每小时只应在上次运行时已对其进行投票的对象上运行,或者对未被投票且需要重置为0的对象运行)。另一个很好的好处是*-分数值不需要仅仅根据对象投票来计算。例如,您可以包括页面视图或其他任何内容。对这种方法的想法?

EN

回答 2

Stack Overflow用户

发布于 2011-08-15 10:23:39

请查看Mongo中的“原子操作人员投票”食谱:http://cookbook.mongodb.org/patterns/votes/。它没有告诉您如何实现聚合,但是您也许可以通过创建表示要投票的对象的驻留对象来实现这一点,但是要在特定的时间内这样做。

票数 2
EN

Stack Overflow用户

发布于 2011-08-12 22:48:41

如果您使用的是红宝石,则有一个用于Mongoid & MongoMapper的蒙戈插件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7046462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档