给出一份文件
{_id:110000, groupings:{A:'AV',B:'BV',C:'CV',D:'DV'},coin:{old:10,new:12}}
我的规范要求在运行时指定映射和聚合的属性,因为用户感兴趣的分组不是预先知道的,而是由用户在运行时指定的。
例如,一个用户将指定[A,B],这将导致
的映射发射emit( {A:this.groupings.A,B:this.groupings.B},this.coin )
而另一个人想要指定[A,C],这将导致
的映射排放emit( {A:this.groupings.A,C:this.groupings.C},this.coin )
B / c mapper和reducer函数执行服务器端,并且无法访问客户端变量,我无法想出在mapper函数中使用变量map键的方法。
如果我可以从map函数的执行范围引用要分组的事物列表,这一切都非常简单。但是,b / c映射函数最终会从不同的范围获取这些函数,我不知道如何执行此操作,或者甚至是否可能。
在我开始尝试动态构建java脚本以通过驱动程序执行之前,有没有人有更好的建议?也许“组”功能会更好地处理这种情况?
答案 0 :(得分:40)
正如@Dave Griffith指出的那样,您可以使用scope
函数的mapReduce
参数。
我努力想弄清楚如何正确地将它传递给函数,因为正如其他人所指出的那样,文档不是很详细。最后,我意识到mapReduce
期待3个参数:
最终,我在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: KEYS,
sumValues: sumValues // of course, you can pass function objects too
}
}
);
答案 1 :(得分:17)
您可以使用map-reduce命令中的“scope”参数将全局只读数据传递到map-reduce函数。我担心,它没有很好的记录。