前言:
为了拥有干净有效的代码,我想在我的 mapreduce mongo 脚本中使用外部函数。
问题:
假设我们有以下映射函数(coffeescript 语法):
map: ->
key = foo(@field)
emit(key, value)
调用外部函数“foo”会引发错误
➜ rake mongo:mapreduce
MongoDB shell version: 2.0.5
connecting to: localhost:27017/connect_development
{
"assertion" : "map invoke failed: JS Error: ReferenceError: foo is not defined nofile_b:2",
"assertionCode" : 9014,
"errmsg" : "db assertion failure",
"ok" : 0
}
我们将返回相同的reduce上下文调用。
坏气味决定 - 自调用匿名函数:
map: ->
key = ( (field)->
# some business logic
)(@field)
emit(key, value)
自调用的匿名函数可能非常大,无法有效测试,并且可能导致内存泄漏(对此不确定)。
如何解决这个问题?
更新:
当我说“外部函数”时,是指使用“map/reduce”函数在同一文件(同一类)中声明的函数。当然,它是在服务器端调用的。
最佳答案
Map/reduce 函数必须在另一个上下文中的数据库服务器上运行,因此它们无法触及任何“外部”内容。
内联使用匿名函数没有任何问题,它们非常便宜 - 只是避免深度递归。 CoffeeScript 具有用于创建您可能想要使用的闭包的语法:
map: ->
key = do =>
k = @field.doSomething()
return k
emit key, value
关于javascript - 在 mongo 映射或减少上下文中调用外部 javascript 函数(对象)的可能方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11323590/