2016-08-15 10 views
0

pymongoの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()] 
関連する問題