2016-08-15 15 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需要是字典。如果你想定義一個變量作爲映射器範圍內的一個函數,將其名稱作爲鍵,並提供包裝在構造函數中的函數聲明。以下是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()] 
相關問題