javascript - 在 mongo 映射或减少上下文中调用外部 javascript 函数(对象)的可能方法

标签 javascript mongodb coffeescript mapreduce

前言:

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

相关文章:

ruby-on-rails - Mongoid 和 has_and_belongs_to_many 关联

javascript - 如何使用 Node.js 自动编译 .coffeescript?

javascript - 带有 for 循环的 AsyncJS

javascript - 区分 IE 和 Firefox 中的鼠标左键和右键单击

javascript - SQL 在node.js 中取消准备PreparedStatement

php - 如何在我的博客上编写评论框?

MongoDB 系统配置文件集合 : no data for "insert" operations?

javascript - 只允许一个div选择jquery类

node.js - Nodejs - Mongoose 连接到定义的 MongoDB

javascript - CoffeeScript 中执行错误的事件