【问题标题】:Possible ways to call external javascript function (object) in mongo map or reduce context在 mongo map 或 reduce 上下文中调用外部 javascript 函数(对象)的可能方法
【发布时间】:2012-07-04 15:11:57
【问题描述】:

前言:

为了获得干净有效的代码,我想在我的 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)

自称为匿名函数可能非常大,无法有效测试,并可能导致内存泄漏(对此不确定)。

如何解决这个问题?

UPD:

当我说“外部函数”时,是指在同一个文件(同一个类)中声明的函数与“map/reduce”函数。当然,它是在服务器端调用的。

【问题讨论】:

    标签: javascript mongodb coffeescript mapreduce


    【解决方案1】:

    Map/reduce 函数必须在数据库服务器上运行,在另一个上下文中,所以它们不能触及任何“外部”。

    使用内联匿名函数并没有错,它们非常便宜——只是避免深度递归。 CoffeeScript 具有用于创建您可能想要使用的闭包的语法:

    map: -> 
      key = do =>
        k = @field.doSomething()
        return k
      emit key, value
    

    【讨论】:

      【解决方案2】:

      Map/Reduce 代码在 MongoDB 服务器上执行。您确实可以选择可以从 Map/Reduce 调用的 storing functions server-side,但最佳实践建议将函数与其余代码一起保存在版本控制中。匿名函数在 JavaScript 中很常用,应该不是问题。

      【讨论】:

        猜你喜欢
        • 2012-07-26
        • 1970-01-01
        • 2016-07-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-23
        相关资源
        最近更新 更多