【问题标题】:Which "kind" of JavaScript is available inside a map and/or reduce function in MongoDB?在 MongoDB 的 map 和/或 reduce 函数中可以使用哪种“类型”的 JavaScript?
【发布时间】:2013-05-25 04:20:39
【问题描述】:

从 2.4 版开始,MongoDB 使用 V8 引擎,因此 ECMA-262 第 5 版。在 在 shell 内 运行 MapReduce 作业时,会有一个额外的supported function 列表。

如果我使用本机 Node.js 驱动程序来运行 mapReduce 作业会怎样?我可以在mapreduce 中使用任何模块或JavaScript 函数吗?

编辑:我现在不能做一些测试来弄清楚,但我会尽快更新问题。

【问题讨论】:

    标签: javascript node.js mongodb mapreduce ecmascript-5


    【解决方案1】:

    MapReduce 在 MongoDB 实例中运行。

    您现在不能使用任何其他编程语言或平台来创建 MapReduce。您可以模拟我认为的概念,但这意味着所有数据都已传输到您的应用程序等。

    通过在提供的map 函数上调用toString 将函数的主体从Node.JS 进程传输到MongoDB(和分片等)(参见here)。

    if ('function' === typeof map) {
        map = map.toString();
    }
    

    您可以在 map 函数中嵌入函数,但随着函数复杂性的增加,您需要确认性能是否满足您的需求。但是,它仍然仅限于您传递的函数,并且无法访问可能正在执行的 Node.JS 中的其他脚本。

    编辑:

    此外,您可以使用mapReduce 调用的scope 参数来附加附加功能。例如,如果您将scope 传递为:

    { add10: function(v) { return v + 10; } }
    

    map 调用(以及 reducefinalize 函数)中可以使用名为 add10 的函数:

    var fancyMath = add10(this.total);
    

    因此,使用该技术,您可以传递一些有限的功能。它确实被序列化为 BSON 并发送到 MongoDB 服务器,因此它需要是自包含的(并且不引用其他本地不可用的 JavaScript 函数)。

    【讨论】:

    • 好的,谢谢。使用 scope 参数传递一个 Node 模块怎么样?
    • @Gremo 不行,模块会被序列化为 BSON,另一端无法反序列化
    • @Gremo - 你想做什么?无论如何,您一次只能访问一个文档...(我担心您在 MapReduce 中尝试做太多事情)。
    • @WiredPrairie:我可以考虑使用辅助函数库,例如用于字符串操作。如何使其在 MongoDB 执行上下文的全局范围内可用?
    • @WiredPrairie 别担心 :) 我不想做任何“奇怪”的事情。我正在做一项研究工作,试图弄清楚事情是如何运作的。无论如何 - 正如 Bergi 所建议的那样 - 一组通用的助手将是一个好主意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多