Mongo DB Map减少跳过记录

时间:2014-02-13 16:42:36

标签: mongodb mapreduce

我正在尝试使用以下命令从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函数中使用的全局变量。

1 个答案:

答案 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' "