Mapreduce pymongo用户断言:13606:';输出';必须是字符串或对象
我搞不清楚我做错了什么。我使用的是pymongo,具有以下映射/减少代码(文档的所有属性都可以直接访问,即此处没有相关的嵌入部分): (在文件getTableMap.js中): 调用map_reduce的python代码如下所示:Mapreduce pymongo用户断言:13606:';输出';必须是字符串或对象,mapreduce,pymongo,assertion,Mapreduce,Pymongo,Assertion,我搞不清楚我做错了什么。我使用的是pymongo,具有以下映射/减少代码(文档的所有属性都可以直接访问,即此处没有相关的嵌入部分): (在文件getTableMap.js中): 调用map_reduce的python代码如下所示: def getTableOnMatchday(self): m = Code(open('getTableMap.js','r').read()) r = Code("""function(k,values) { var foo = 'foo';
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代码,我直接改编了文档中的简单示例:
运行代码时得到的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代码来看,第三个参数('out',根据pymongo 2.0.1文档)是'myresult',它当然是一个字符串
pymongo在这里抱怨什么?Javascript在语法上是正确的(我认为).我知道reduce目前没有做任何事情,但这不应该阻止命令serverside的编译-或者可能是这样的?通过更多的尝试和错误,并通过阅读PHP驱动程序的文档,我想我已经找到了答案:
result = bl_1.map_reduce(m, r, out="foo")
实际上,您必须指定out=string作为第三个参数
文档中的示例在这里误入歧途,正如它所说:
result = bl_1.map_reduce(m, r, "foo")
MapReduce输出选项:
v1.8之前版本:如果未为out指定值,则结果将被放置到临时集合中,其名称将在命令的输出中给出(请参见下文)。否则,可以为out选项指定集合的名称,并将结果放置在该集合中
v1.8+:输出选项已更改。Map reduce不再生成临时集合(因此,keepTemp已被删除)
可以找到更多信息
result = bl_1.map_reduce(m, r, "foo")