1

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

我的问题是,我想根据以下字段修改带有时间惩罚的文档的分数time_updated:文档越老,分数应该越低。最大的问题是,我必须在运行时执行此操作。我可以遍历所有文档,更新分数,然后按分数排序。但这会花费太多时间,因为集合中有大量文档。

所以我的问题是:使用 MongoDB,我可以按计算属性排序吗?有没有办法做到这一点?或者是否有计划下一个版本的 MongoDB 的功能?

4

1 回答 1

2

分数究竟是如何更新的?

如果它很简单并且可以放入$add、$multiply 等术语中,那么聚合管道将运行良好。否则,您将需要使用简单的MapReduce 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.
};

对于 10000 行,无论是聚合管道还是简单的 MapReduce 都可能具有足够的性能。

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

于 2013-01-18T18:04:00.703 回答