mongo でパラメトリック マップ/リデュース ジョブを実行する JavaScript 関数をいくつか作成したいと思いますが、JavaScript のスコープについて混乱しています。たとえば、次のコードは"gender"
変数のカウントを示します。"male"
つまり、私が持っているレコードの数とレコードを教えてくれます"female"
:
// count categories
db.responses.mapReduce(
function(){
emit(this["gender"], {count: 1})
}, function(state, values){
var result = {count: 0};
values.forEach(function(value) {
result.count += value.count;
});
return result;
}, {out: { inline : 1}}
);
これは完全に正常に機能します。次のステップでは、任意のプロパティに対してこれを行う関数を作成したいと思います
function countCategories(item) {
function mapper(it){
fn = function(){
if(this[it]){
emit(this[it], {count: 1});
}
};
return fn;
}(item);
var reducer = function(state, values){
var result = {count: 0};
values.forEach(function(value) {
result.count += value.count;
});
return result;
};
var out = {out: { inline : 1}};
var results = db.responses.mapReduce(
mapper,
reducer,
out
);
return results;
}
countCategories("gender")
しかし、私がしようとすると:
countCategories("gender")
{
"results" : [ ],
"timeMillis" : 48,
"counts" : {
"input" : 2462,
"emit" : 0,
"reduce" : 0,
"output" : 0
},
"ok" : 1,
}
出力関数は一度も呼び出されていません。ここで何がうまくいかなかったのですか?私の推測ではemit
、mongo が提供する関数のスコープに関するものですが、なぜそれが呼び出されないのか、エラーがスローされるのかはよくわかりません。