给出一份文件
{_id:110000, groupings:{A:'AV',B:'BV',C:'CV',D:'DV'},coin:{old:10,new:12}}
Run Code Online (Sandbox Code Playgroud)
我的规范要求在运行时指定映射和聚合的属性,因为用户感兴趣的分组不是预先知道的,而是由用户在运行时指定的.
例如,一个用户将指定[A,B],这将导致映射发射
emit( {A:this.groupings.A,B:this.groupings.B},this.coin )
Run Code Online (Sandbox Code Playgroud)
而另一个人想要指定[A,C],这将导致映射发射
emit( {A:this.groupings.A,C:this.groupings.C},this.coin )
Run Code Online (Sandbox Code Playgroud)
B/c mapper和reducer函数执行服务器端,并且无法访问客户端变量,我无法想出在mapper函数中使用变量map键的方法.
如果我可以从map函数的执行范围引用要分组的事物列表,这一切都非常简单.但是,b/c映射函数最终从不同的范围获取这些,我不知道如何做到这一点,或者甚至可能.
在我开始尝试动态构建java脚本以通过驱动程序执行之前,有没有人有更好的建议?也许"组"功能会更好地处理这种情况?
Rod*_*gue 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 result;
}
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
}
}
);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
13407 次 |
最近记录: |