Можно ли передать функцию javascript в параметре области видимости Collection.map_reduce в pymongo? - PullRequest
0 голосов
/ 01 апреля 2012

Дано:

jstrMap = """
function() {
  print("isPointInside = " + isPointInside);
  print("polygon = " + polygon);
  emit(this._id, this);
}
"""
jstrReduce = """
function(key, values) {
  return values[0];
}
"""

def readJSCodeFromFile(filePath):
  with open(filePath) as f:
    return Code(f.read())

jsIsPointInside = readJSCodeFromFile(path.join(path.dirname(__file__), 'IsPointInside.js'))

IsPointInside.js:

function(pt, poly) {
}

И я вызываю map_reduce так:

mycoll.map_reduce(jstrMap, jstrReduce, 'results',
    scope = {'isPointInside': jsIsPointInside, 'polygon': [[-77, 39], [-77,38], [-78,38], [-78,39]]})

Вот что я получаю на клиентской консоли:

db assertion failure, assertion: 'map invoke failed: JS Error: TypeError: isPointInside is not a function nofile_b:3', assertionCode: 9014

И вывод сервера:

isPointInside = null
polygon = -77,39,-77,38,-78,38,-78,39
Sun Apr 01 16:29:14 [conn11] JS Error: TypeError: isPointInside is not a function nofile_b:3
Sun Apr 01 16:29:14 [conn11] mr failed, removing collection :: caused by :: 9014 map invoke failed: JS Error: TypeError: isPointInside is not a function nofile_b:3

Отладка кода Python показывает, что jsIsPointInside имеет тип Code, как и ожидалось. str(jsIsPointInside) возвращает текст функции, то есть 'function (pt, poly) {\ n} \ n'

Я не хочу заполнять коллекцию system.js, я бы хотел передать функцию в область видимости. Возможно ли это вообще?

Спасибо.

1 Ответ

0 голосов
/ 03 апреля 2012

Область действия - это объект, в котором поля помещаются в область действия MapReduce как переменные с именем поля.

Если вы хотите поместить функцию в область действия, вам нужно сделать ее значением в поле, например

scope = {
    myFunc: function() { return "Foo";} 
}
...