pymongo用户断言:13606:'out'必须是一个字符串或一个对象

Cia*_*ran 3 mapreduce assertion pymongo

我无法弄清楚我在这里做错了什么.我正在使用pymongo并具有以下map/reduce代码(文档的所有属性都可以直接访问 - 即没有相关的嵌入部分:

(在文件getTableMap.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]);
}
Run Code Online (Sandbox Code Playgroud)

调用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
Run Code Online (Sandbox Code Playgroud)

对于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
Run Code Online (Sandbox Code Playgroud)

这并没有完全告诉我,所以我把mongod登录到verbose并在日志中找到了这个:

Thu Sep 15 21:04:02 [conn7] User Assertion: 13606:'out' has to be a string
or an object
Run Code Online (Sandbox Code Playgroud)

从查看实际生成map_reduce调用的Python代码,第三个参数('out',根据pymongo 2.0.1文档)是'myresult',它肯定是一个字符串.

什么是pymongo在这抱怨?Javascript在语法上是正确的(我认为).我知道reduce目前什么都不做,但这不应该阻止命令服务器端的编译 - 或者它可能呢?

Cia*_*ran 6

我想通过更多的试验和错误以及阅读PHP驱动程序的文档,我找到了答案:

result = bl_1.map_reduce(m, r, out="foo")
Run Code Online (Sandbox Code Playgroud)

实际上你必须指定out = string作为第三个参数.

文档中的示例在这里误入歧途,因为它说:

result = bl_1.map_reduce(m, r, "foo") 
Run Code Online (Sandbox Code Playgroud)