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