Утверждение пользователя pymongo: 13606: 'out' должен быть строкой или объектом - PullRequest
3 голосов
/ 15 сентября 2011

Я не могу понять, что я делаю здесь неправильно. Я использую pymongo и имею следующий код карты / сокращения (все атрибуты документа доступны напрямую, то есть здесь нет релевантных частей:

(в файле 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]);
}

Код Python, который вызывает map_reduce, выглядит следующим образом:

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 Карта Сокращение примера из документации 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, входя в систему, и нашел это в логах:

Thu Sep 15 21:04:02 [conn7] User Assertion: 13606:'out' has to be a string
or an object

Если посмотреть на код Python, который фактически генерирует вызов map_reduce, то третий параметр ('out', согласно документации pymongo 2.0.1) - это "myresult", который, безусловно, является строкой.

На что здесь жалуется пимонго? Javascript синтаксически правильный (я думаю). Я знаю, что сокращение в настоящее время ничего не делает, но это не должно помешать компиляции команды на стороне сервера - или, может быть, это так?

Ответы [ 2 ]

6 голосов
/ 16 сентября 2011

Я думаю, что нашел ответ, пробуя больше ошибок и проб и читая документацию для драйвера PHP:

result = bl_1.map_reduce(m, r, out="foo")

Вы фактически должны указать out = string в качестве третьего параметра.

Пример в документации вводит в заблуждение, как говорится:

result = bl_1.map_reduce(m, r, "foo") 
0 голосов
/ 06 сентября 2012

Опции вывода MapReduce: pre-v1.8: Если вы не укажете значение для out, то результаты будут помещены во временную коллекцию, имя которой будет указано в выходных данных команды (см. ниже). В противном случае вы можете указать имя коллекции для опции out, и результаты будут размещены там.

v1.8 +: параметры вывода изменены. Map-Reduction больше не генерирует временные коллекции (таким образом, keepTemp был удален).

больше информации можно найти здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...