我正在尝试使用以下命令从mongo map reduce实用程序中跳过记录。
db.<collectionName>.mapReduce(
"function () { counter++; if (counter > <numberOfRecordsToBeSkipped>){ emit(this.fieldName, 1); } }",
"function (key, values) { return Array.sum(values); }" ,
{"out" : <CollectionName>,"scope" : "{var counter:0}" ,
"limit" : 0}
);
我一直收到以下错误。
uncaught exception: map reduce failed:{
"errmsg" : "exception: map invoke failed: JS Error: ReferenceError: counter is not defined nofile_b:0",
"code" : 9014,
"ok" : 0
}
有人可以帮我吗?我知道scope属性可用于定义要在map / reduce函数中使用的全局变量。
答案 0 :(得分:0)
虽然scope
参数的语法错误:
scope: { counter: 0 }
您还会遇到scope
文档只读的问题。如果传递给scope
的文档仅在一个分片服务器上更改,则它在分片设置中不起作用。此外,无法保证map-reduce处理的文档顺序从执行到执行都是相同的。因此,它会产生不一致的结果。
这是一个简单的测试,其中包含一个userid
字段的文档:
{
userid: 1234
}
代码:
map = function () { counter++; if (counter > 1){ emit(this.userid, 1); } }
reduce = function (key, values) { return Array.sum(values); }
使用中:
db.tw.mapReduce(map, reduce, { out: "tw2", scope: { counter: 0 } })
代码按预期执行。通过将counter
预设为值,我控制了map
阶段中处理的文档数量。我确认输出符合预期。
如果我更改地图代码:
map = function () { counter++; if (counter > numberToSkip) { emit(this.userid, 1); } }
尝试调用mapReduce
函数而不做任何更改,我会看到一个errmsg
:
ReferenceError: numberToSkip is not defined near 'ounter > numberToSkip){ emit(thi' "