0

私は mapreduce を理解して頭がおかしくなりました。だから、私はあなたに助けを求めます。

私はそのようなエンティティを持っています:

public class ConstraintSpec
{
    [BsonId]
    public int Id { get; set; }
    public bool OrderRequired { get; set; }
    public ActionTypeConstraintSpec[] ActionTypeConstraintSpecs { get; set; }
}

そして、IDジェネレーターを作成しようとしています。

これが私の「動作しない」MapReduce js コードです。

Map = "map = function () {" +
              "emit(this._id)}";

        Reduce = "reduce = function (key, values) {" +
                     "var max = this[0];" +
                     "var len = this.length;" +
                     "for (var i = 1; i < len; i++) if (this[i] > max) max = this[i];" +
                     "return max;" +
                 "}";

それから私は書いています:

var mapreduce = cont.MapReduce(Map, Reduce);
        var x = mapreduce.GetResults();

しかし、何も機能しません。

助けてください!

4

1 に答える 1

1

map reduce で何を達成しようとしていますか? また、どのフィールドに対して最大値を見つける必要がありますか? マップ関数では、集計/比較しようとしている値を発行する必要があります。現在、キー this.id のみを発行しています。おそらく、_id はドキュメントごとに一意であるため、reduce 関数が呼び出されなくなります (特定のキーに対して単一のドキュメントが発行された場合、reduce は呼び出されません)。キーは、データを集計するフィールドの名前である必要があります。

たとえば、シェルでは次のようになります。

入力データ:

{_id: 1, name: "test1", number: 5}
{_id: 2, name: "test1", number: 8}
{_id: 3, name: "test2", number: 3}
{_id: 4, name: "test2", number: 11}

マップ機能:

function () {
    emit{this.name, this.number}
}

縮小機能:

    function(key, values) {
        var max = 0;
        values.forEach(function(value) {
           if(value > max){
              max = value;
           }
        });
        return max;
    }

出力データ:

{_id: "test1", value: 8}
{_id: "test2", value: 11}
于 2012-06-14T18:07:39.143 に答える