在MongoDB中,将函数应用于集合中的所有对象的最有效方法是什么?
What's the most efficient way to apply a function to all objects in a collection in MongoDB?
假设我想计算集合中所有对象的"popularity"字段。它取决于从当前时间到字段"submitTime"和字段"votes"中的数字的差值。这个手术每小时进行一次。在所有对象上运行函数的最有效方法是什么?只是一个例子,它可以是任何函数:
function(){
this.popularity = this.votes / (Date.now() - this.submitTime);
}
如果要在所有对象上运行一个函数并保存原始集合中的流行度评分,那么最好的方法是遍历所有文档以计算并保存新评分。如果你想保存到一个不同的集合,你可以使用MapReduce来代替。
如果你对如何计算受欢迎程度的其他想法持开放态度,还有更多的选择:)。
提高效率要提高当前方法的效率,您可以:
- 将您的更新标准限制为拥有超过0票的文档(否则无论如何您将被除以零)
- 只检索您需要计算流行度的字段,并使用
$set
更新流行度字段,而不是重新保存整个文档。 - 当您添加个人投票时更新人气评分(避免每小时完整召回所有分数),然后做一个不太频繁的(例如。
使用可以通过排序而不是计算来确定的流行度度量。例如:
{ votes: -1, lastVotedTime: -1, submitTime: -1 }
。但是,这可能无法满足您对老化旧文档的流行程度的要求。使用数字流行度度量,其中事件和用户操作(例如;文章发表,用户意见/投票/,…)会增加不同的人气值。随着时间的推移,受欢迎程度逐渐下降。Drupal的radiation模块通过基于规则的方法实现了这一点。
要在MongoDB中实现后一种方法,可以:
- 添加一个整数
popularity
字段,其中新对象从某个值(例如1000)开始 - 有不同的用户操作(新的投票,意见等)增加人气计数器使用
$inc
适当的数量(例如50为一个新的投票) - 使用定期调度的作业来减少受欢迎程度。
- 由于所有流行度都以正分数开始并衰减到0或更小,因此您可以将更新查询限制为流行度>0的文档。
- 您还可以(ab)使用流行度评分来确保重要文档的流行时间更长。
关于"什么是好的流行度度量"有更多的细微差别,并且在StackOverflow上有很多以前的问题(例如:应该使用什么公式来确定"热门"问题?)。
相关文章:
- Rails将JavaScript对象存储到Model的有效方式
- 将JS对象数组转换为嵌套形式的最有效方法
- I'我在页面加载时将整个$_SESSION变量放入一个json对象中.虽然这对我有效,但这是一个好的做法吗
- 如何有效地匹配两个不同 JavaScript 对象上的 id,并将它们合并在一起
- 以有效的方式搜索对象列表 mongo
- Date对象在Chrome中有效,但在Safari、Firefox或IE中无效
- 正在将字符串转换为有效的JSON对象
- 使用一堆 setTimeouts 还是一个 setInterval 来刷新一堆对象更有效
- JSON tv4 对象在 true 且存在其他对象时有效
- JavaScript 中更有效的选项对象
- 为什么这种用于计算数组重复并将其存储到对象中的方法有效
- tizen.filesystem.resolve() error - 对象的内容不包含有效值
- 函数是否是 JavaScript 对象属性的有效键
- JS:为什么这个对象属性不起作用,只有当我把它作为变量放在其中一个方法中时,它才有效
- 使用具有有效 JavaScript 格式的 Json.NET 序列化对象
- 在 JavaScript 中合并多个排序对象数组的最有效方法是什么?
- 有效记忆对象参数
- Javascript:可以访问对象并显示它,但不是该对象的有效属性
- 为什么不'对象点表示法对未知类型的对象有效吗?(TypeError:undefined不是对象)
- 多长时间是从FB打开图形用户对象有效的图片url