2016-08-15 1 views
0

Может ли кто-нибудь предоставить пример с правильным синтаксисом для передачи функции параметру области при использовании picongo's map_reduce.Как передать функцию в область с помощью pymongo.map_reduce

До сих пор я нашел примеры прохождения функции в javascript (How to use variables in MongoDB Map-reduce map function) и передачи переменных с pymongo (Map reduce execute failed with pymongo but success in mongo shell).

При попытке я всегда получаю «TypeError: foo не функция», и из журналов сервера похоже, что он принял функцию, которую я передал в область как строку.

ответ

1

Сегодня я немного поиграл с этим. Аргумент ключевого слова scope должен быть словарем. Если вы хотите определить переменную, которая будет функцией в области отображения, поместите ее имя в качестве ключа и укажите объявление функции, заключенное в конструктор Code(). Вот что должно быть рабочим примером с MongoDB v3.2.8 и pymongo v3.3.1:

import pymongo 
import bson 

db = pymongo.MongoClient().test 

db['test-input'].insert_many([ 
    {'foo': 'bar', 'angle': 0}, 
    {'foo': 'bar', 'angle': 90}, 
    {'foo': 'baz', 'angle': -90} 
]) 

mapper = bson.Code(
    """ 
     function map() { 
      emit(this.foo, radians(this.angle)) 
     } 
    """ 
) 

reducer = bson.Code(
    """ 
     function reduce(key, values) { 
      var avg = 0; 
      for (i in values) { 
       avg += values[i]; 
      } 
      return avg/values.length; 
     } 
    """ 
) 

output_collection = db['test-input'].map_reduce(
    mapper, reducer, 'test-output', 
    scope={ 
     'radians': bson.Code("function(x) {return x * Math.PI/180}") 
    } 
) 

print [x for x in output_collection.find()] 
Смежные вопросы