如何在MongoDB中使用变量Map-reduce map函数

gbe*_*ley 19 mongodb

给出一份文件

{_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)


Dav*_*ith 17

您可以使用map-reduce命令中的"scope"参数将全局只读数据传递到map-reduce函数.我担心,它没有很好的记录.