Mapreduce pymongo用户断言:13606:';输出';必须是字符串或对象

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';

我搞不清楚我做错了什么。我使用的是pymongo,具有以下映射/减少代码(文档的所有属性都可以直接访问,即此处没有相关的嵌入部分):

(在文件getTableMap.js中):

调用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代码,我直接改编了文档中的简单示例:

运行代码时得到的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")