Mongoose mapreduce:使用array.some的map函数

时间:2013-02-19 16:20:45

标签: mapreduce mongoose

这个Javascript在我的地图功能之外工作正常:

var cribs = ["list","tree"];

if ( cribs.some(function(i){return (new RegExp(i,'gi')).test("a long list of words");}) ) {
 console.log('match');
}

(它只是使用数组中的值搜索字符串)。

虽然在我的地图功能中使用它不起作用:

var o = {};
o.map = function () { 
    if ( cribs.some(function(i){return (new RegExp(i,'gi')).test(this.name);}) ) {
        emit(this, 1) ;
    }
}
o.out = { replace: 'results' }
o.verbose = true;
textEntriesModel.mapReduce(o, function (err, model, stats) {
    model.find(function(err, data){
        console.log(data);
    });
})

它不会发出任何内容,所以我有一个空的结果集。没有错误。

如果我不使用array.some,而只是使用普通的正则表达式,那么它可以正常工作:

o.map = function () { 
    if(this.name.match(new RegExp(/list/gi))) {
        emit(this, 1) ;
    }
}

所以我的问题是,为什么上面的array.some函数在我的map函数中不起作用?

我有一长串需要匹配的单词,所以我真的不想单独为它们写一个正则表达式,上面的应该工作。

这是我试图在我的地图函数中使用的函数的jsfiddle:http://jsfiddle.net/tnq7b/

1 个答案:

答案 0 :(得分:3)

您需要cribs功能将map添加到scope选项中,以使var cribs = ["list","tree"]; var o = {}; o.map = function () { if (cribs.some(function(i){return (new RegExp(i,'gi')).test(this.name);})) { emit(this, 1); } } o.out = { replace: 'results' }; o.scope = { cribs: cribs }; o.verbose = true; textEntriesModel.mapReduce(o, function (err, model, stats) { model.find(function(err, data){ console.log(data); }); }); 可用:

{{1}}