假设我想计算我的集合中所有对象的“流行度”字段。这取决于当前时间与“submitTime”字段的差异以及“votes”字段中的数字。此操作将每小时运行一次。在所有对象上运行函数的最有效方法是什么?只是一个例子,它可以是任何函数:
function(){
this.popularity = this.votes / (Date.now() - this.submitTime);
}
假设我想计算我的集合中所有对象的“流行度”字段。这取决于当前时间与“submitTime”字段的差异以及“votes”字段中的数字。此操作将每小时运行一次。在所有对象上运行函数的最有效方法是什么?只是一个例子,它可以是任何函数:
function(){
this.popularity = this.votes / (Date.now() - this.submitTime);
}
如果您想对所有对象运行一个函数并在原始集合中保存一个流行度分数,那么您最好的方法是迭代所有文档以计算并保存新分数。如果你想保存到不同的集合,你可以使用MapReduce代替。
如果您对如何计算流行度的其他想法持开放态度,还有更多选择:)。
为了提高您当前方法的效率,您可以:
$set
而不是重新保存完整文档来更新流行度字段。使用可以通过排序而不是计算来确定的流行度指标。例如:{ votes: -1, lastVotedTime: -1, submitTime: -1 }
。但是,这可能无法满足您对旧文档的流行度进行老化的要求。
使用数字流行度指标,其中事件和用户操作(例如文章发布、用户查看/投票/、..)将添加不同的流行度值。随着时间的推移,人气会下降。Drupal的Radioactivity 模块通过基于规则的方法实现了这一点。
要在 MongoDB 中实现后一种方法,您可以:
popularity
字段,其中新对象从某个值开始(例如 1000)$inc
以适当的数量增加受欢迎程度计数器(例如 50 个新投票)“什么是好的流行度指标”还有更多细微差别,以及 StackOverflow 上的大量先前问题(例如:应该使用什么公式来确定“热门”问题?)。