MongoDB:按计算属性排序

MongoDB:按计算属性排序,mongodb,Mongodb,在我的数据库中,我有一个集合,其中文档有一个字段score,它是一个浮点(-1..1)。我可以查询数据库以返回按分数排序的前20个结果 我的问题是,我想根据time\u updated字段修改带有时间惩罚的文档分数:文档越老,分数应该越低。最大的问题是,我必须在运行时这样做。我可以迭代所有文档,更新分数,然后按分数排序。但这将花费太多的时间,因为收藏中有大量的文档 所以我的问题是:对于MongoDB,我可以通过计算属性进行排序吗?有办法吗?或者在规划下一个版本的MongoDB时是否有功能?分数是

在我的数据库中,我有一个集合,其中文档有一个字段
score
,它是一个浮点(
-1..1
)。我可以查询数据库以返回按分数排序的前20个结果

我的问题是,我想根据
time\u updated
字段修改带有时间惩罚的文档分数:文档越老,分数应该越低。最大的问题是,我必须在运行时这样做。我可以迭代所有文档,更新分数,然后按分数排序。但这将花费太多的时间,因为收藏中有大量的文档


所以我的问题是:对于MongoDB,我可以通过计算属性进行排序吗?有办法吗?或者在规划下一个版本的MongoDB时是否有功能?

分数是如何更新的

如果它很简单并且可以放入,那么聚合管道将很好地工作。否则,您需要使用一个简单的a来进行分数更新

var mapFunction = function() {
    emit(this._id, <compute score here from this.score and this.time_updated>);
};

var reduceFunction = function (values) {
    return values[0]; // trivial reduce function since incoming id's are unique.
};
var mapFunction=function(){
发射(这个);
};
var reduceFunction=函数(值){
返回值[0];//因为传入的id是唯一的,所以reduce函数很简单。
};
对于10000行,聚合管道或简单的MapReduce都可能具有足够的性能


对于更大的数据集,您可能需要使用更复杂的MapReduce(实际上是reduce)来提高内存效率。您可能还想利用。

在聚合框架中,它可以根据您正在计算的行数、计算字段数,来确定这是否能够以足够高的性能在您的场景中使用(我假设在页面上进行临时查询),就像在SQL中一样,必须在内存中排序。聚合框架是什么意思?栏杆之类的?每个用户可以有大约10.000行,我只想检索前20行。所以现在,我必须获取10000行,计算新的基于时间的分数,按分数排序,只返回20行。我想这是一点开销。我在Rails 3中做这件事,我认为这不是最快的方法。这是聚合框架:它是在2.1中引入的,很像SQLs自己的,有很多在标准SQL聚合框架中可以找到的特性。