我不知道我做错了什么。我正在使用pymongo,并有以下map/reduce代码(文档的所有属性都可以直接访问-即没有嵌入的部分相关在这里:
(在getablemap .js文件中):
function() {
var tablePoints1 = 0;
var tablePoints2 = 0;
if (this.pointsTeam1 == this.pointsTeam2) {
tablePoints1 = 1;
tablePoints2 = 1;
}
else {
if (this.pointsTeam1 > this.pointsTeam2) {
tablePoints1 = 3;
}
else {
tablePoints2 = 3;
}
}
emit(this.idTeam1, [tablePoints1, this.pointsTeam1, this.pointsTeam2]);
emit(this.idTeam2, [tablePoints2, this.pointsTeam2, this.pointsTeam1]);
}
调用map_reduce的python代码如下所示:
def getTableOnMatchday(self):
m = Code(open('getTableMap.js','r').read())
r = Code("""function(k,values) {
var foo = 'foo';
return(foo);
}""")
result = bl_1.map_reduce(m, r, "myresult")
for doc in result.find():
print doc
对于Python代码,我直接从文档中引用了一个简单的例子:http://api.mongodb.org/python/current/examples/map_reduce.html Map Reduce示例来自pymongo 2.0.1文档
我运行代码时得到的Python回溯是:
>>> api.getTableOnMatchday()
Traceback (most recent call last):
pymongo.errors.OperationFailure: command SON([('mapreduce', u'bl1_2011'),
...
...
...
) failed: db assertion failure
这并没有告诉我太多,所以我把mongod日志打开为verbose,在日志中发现了以下内容:
Thu Sep 15 21:04:02 [conn7] User Assertion: 13606:'out' has to be a string
or an object
查看实际生成map_reduce调用的Python代码,第三个参数(根据pymongo 2.0.1文档,'out')是'myresult',这当然是一个字符串。
pymongo在抱怨什么?Javascript在语法上是正确的(我认为)。我知道reduce目前什么都不做,但这不应该阻止命令服务器端的编译-或者它可能会?
我想我已经找到了答案,通过更多的试验和错误,并通过阅读PHP驱动程序的文档:
result = bl_1.map_reduce(m, r, out="foo")
你实际上必须指定out=string作为第三个参数。
文档中的示例在这里被误导了,因为它说要这样做:
result = bl_1.map_reduce(m, r, "foo")
MapReduce输出选项:pre-v1.8:如果您没有为out指定值,那么结果将被放置到一个临时集合中,其名称将在命令的输出中给出(见下文)。否则,您可以为out选项指定集合的名称,结果将放在那里。
v1.8+:输出选项已更改。Map-reduce不再生成临时集合(因此,keepTemp已被删除)。
更多信息请点击此处