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

时间:2011-09-01 16:29:03

标签: mongodb

给出一份文件

{_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脚本以通过驱动程序执行之前,有没有人有更好的建议?也许“组”功能会更好地处理这种情况?

2 个答案:

答案 0 :(得分:40)

正如@Dave Griffith指出的那样,您可以使用scope函数的mapReduce参数。

我努力想弄清楚如何正确地将它传递给函数,因为正如其他人所指出的那样,文档不是很详细。最后,我意识到mapReduce期待3个参数:

  • 地图功能
  • 减少功能
  • 具有一个或多个定义in the doc
  • 的参数的对象

最终,我在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函数。我担心,它没有很好的记录。