2014-02-13 79 views
0

我想使用下面的命令跳过mongo map reduce utility的记录。Mongo DB Map减少跳过记录

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 
} 

任何人都可以请帮助我吗?我知道范围属性可以用来定义要在地图/缩小功能中使用的全局变量。

回答

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' " 
+0

谢谢。不过,我尝试了你的建议,但仍然遇到同样的问题。不知何故,我在范围内定义的变量不适用于地图功能。 – user3306944

+0

你有其他错误吗?我可以让它工作。它甚至不是只读的(MongoDB建议他们将范围变量设置为只读)。您的代码有其他JavaScript错误。 – WiredPrairie

+0

此外 - 你使用的是什么版本的MongoDB?你看到的错误与我所看到的不一致有点奇怪。 – WiredPrairie