Posibles formas de llamar a la función javascript externa (objeto) en el mapa mongo o reducir el contexto

Prefacio:

Para tener un código limpio y efectivo, quiero usar funciones externas en mi secuencia de comandos mapreduce mongo.

Problema:

dado que tenemos la siguiente función de mapa (sintaxis de coffescript):

map: -> 
   key = foo(@field)
   emit(key, value)

Llamar a una función externa 'foo' genera un error

➜ 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
}

Lo mismo devolveremos para reducir la llamada de contexto.

Decisión de mal olor: función anónima autodenominada:

map: -> 
   key = ( (field)->
     # some business logic
   )(@field)

   emit(key, value)

La función anónima autodenominada podría ser muy grande y no efectiva para probar y puede causar fugas de memoria (no estoy seguro de esto).

¿Cómo resolver este problema?

UPD:

Cuando dije "función externa", me refiero a la función declarada en el mismo archivo (en la misma clase) con funciones de "mapa/reducción". Por supuesto, se invoca en el lado del servidor.

preguntado el 04 de julio de 12 a las 07:07

2 Respuestas

Las funciones de mapa/reducción deben ejecutarse en los servidores de base de datos, en otro contexto, para que no puedan tocar nada "externo".

No hay nada de malo en usar funciones anónimas en línea, son extremadamente baratas, solo evite la recursividad profunda. CoffeeScript tiene una sintaxis para crear cierres que tal vez quieras usar:

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

Respondido 05 Jul 12, 01:07

El código Map/Reduce se ejecuta en los servidores MongoDB. Tienes la opción de almacenar funciones del lado del servidor eso se puede llamar desde Map/Reduce, pero la mejor práctica sugiere mantener las funciones con el resto de su código en el control de versiones. Las funciones anónimas se usan comúnmente en JavaScript y no deberían ser un problema.

Respondido 05 Jul 12, 01:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.