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 に答える