1

MongoDBjavascriptのarugmentをmap関数に渡すことについて質問があります。現在、私が考えていたのは次のようなものです。

var map = function(n) {
    if(this.x == n){
        emit(this.x);
    }
}
var reduce = function(key, values) {
    values.forEach(function(x) {
        //do something
    });
    return {nd:values};
}
db.smsdb.mapReduce(map(2), reduce, "collection")

しかし、私がこれを行おうとすると、シェルは「コードではありません」というエラーを返します...したがって、私はこれを正しい方法で行っていないと推測しています。誰かがこの種の問題に対する正しい解決策を持っていますか、私はそれを正しくすることができてうれしいです。

ありがとう

4

4 に答える 4

1

この行:

db.smsdb.mapReduce(map(2), reduce, "collection")

は、のマップ関数として渡されるmap(2)結果()を使用して呼び出しています。undefinedmapReduce

代わりに、次のようなことを行います。

db.smsdb.mapReduce(function(){ map.call(this, 2); }, reduce, "collection")

アップデート

map関数が実行mapされているスコープで関数が使用できないため、上記は機能しません。mapReduceしたがって、必要なマップ関数を生成できる単一の関数にまとめる必要があります。

var mapper = function(n) {
    function map() {
        if(this.x == n){
            emit(this.x);
        }
    }
    return map;
};
db.smsdb.mapReduce(mapper(2), reduce, "collection");
于 2012-12-01T17:28:31.820 に答える
1

スコープInMapreduceはグローバルパラメーターを表しますマップリデュース @DaveGriffithが指摘しているように、mapReduce関数のスコープパラメーターを使用できます。

他の人が指摘しているように、ドキュメントがあまり詳細ではないため、関数に適切に渡す方法を理解するのに少し苦労しました。mapReduce最後に、私はそれが3つのパラメーターを期待していることに気づきました。

map function
reduce function
object with one or more of the params defined in the doc
Eventually, I arrived at the following code in Javascript:

// I define a variable external to my map and to my reduce functions
var KEYS = {STATS: "stats"};

function m() {
    // I use my global variable inside the map function
    emit(KEYS.STATS, 1);
}

function r(key, values) {
    // I use a helper function
    return sumValues(values);
}

// Helper function in the global scope
function sumValues(values) {
    var result = 0;
    values.forEach(function(value) {
        result += value;
    });
    return value;
}

db.something.mapReduce(
    m,
    r,
    {
         out: {inline: 1},
         // I use the scope param to pass in my variables and functions
         scope: {
             KEYS: 1,
             sumValues: 22// of course, you can pass function objects too
         }
    }
);
于 2014-04-11T11:23:47.363 に答える
0

あなたはこれを行うことができます:

db.smsdb.mapReduce(function() { return map(2); }, reduce, "collection")
于 2012-12-01T17:19:20.150 に答える
0

また、このソリューションも機能することを指摘しておく必要があります。

var map = function() { if(this.x == n){ emit(this.x); } } db.smsdb.mapReduce(mapper, reduce, {out:"nodes",scope:{n:2}});

于 2012-12-01T20:22:56.183 に答える