假设我想计算集合中所有对象的“受欢迎程度”字段。它取决于当前时间与“submitTime”字段的差异以及“投票”字段中的数字。此操作将每小时运行一次。在所有对象上运行函数的最有效方法是什么?举个例子,它可以是任何功能:
function(){
this.popularity = this.votes / (Date.now() - this.submitTime);
}
答案 0 :(得分:1)
如果要在所有对象上运行函数并在原始集合中保存流行度分数,则最佳方法是迭代所有文档以计算并保存新分数。如果您想保存到其他收藏品,可以使用MapReduce代替。
如果您对如何计算受欢迎程度的其他想法持开放态度,可以选择更多选项:)。
为了提高当前方法的效率,您可以:
$set
更新受欢迎程度字段,而不是重新保存完整文档。使用可通过排序而非计算确定的流行度量标准。例如:{ votes: -1, lastVotedTime: -1, submitTime: -1 }
。但是,这可能无法满足您对旧文档流行度老化的要求。
使用数字流行度指标,其中事件和用户操作(例如,文章发布,用户观看/投票/,......)将添加不同的流行度值。随着时间的推移,人气衰退。 Radioactivity module for Drupal使用基于规则的方法实现此目的。
要在MongoDB中实现后一种方法,您可以:
popularity
字段,其中新对象以特定值(例如1000)开始$inc
以适当的金额(例如50为新投票)增加受欢迎度计数器“什么是良好的人气指标”还有更多细微差别,以及关于StackOverflow的大量先前问题(例如:What formula should be used to determine “hot” questions?)。