You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MongoDB 4.4执行$function聚合报unexpected token 'function'语法错误

问题根因

该报错与security.javascriptEnabled配置无关,核心是$function聚合运算符的参数格式不符合MongoDB服务端解析要求:

  • MongoDB官方语法规定,$function的body字段必须传入字符串类型的JavaScript函数源码,不支持直接传入原生JavaScript函数对象。
  • 你当前写法中直接将function(ss){...}作为对象属性传入,聚合管道序列化为BSON发送给服务端时,原生函数对象不会被自动转换为服务端可识别的合法字符串源码,服务端JS引擎解析收到的内容时碰到非法语法,最终抛出139错误码的解析失败提示。
修复方案

将body字段的函数内容包裹为字符串,同时修正args字段的字段引用格式(引用文档字段必须加$前缀,否则会传入固定字符串常量而非字段值),修正后的可运行代码如下:

db.my_collection.aggregate([
    {
        $addFields: {
            query: {
                $function: {
                    body: `function(ss){
                        const arr = ss.split('|');
                        const result = {};
                        arr.forEach(element => {
                            const kv = element.split(':');
                            result[kv[0]] = kv[1];
                        });
                        return result['q'];
                    }`,
                    args: ['$my_field'],
                    lang: 'js'
                }
            }
        }
    }
]);
额外注意事项
  • 函数内部声明变量时建议显式添加const/let关键字,避免变量泄漏到JS执行全局作用域,引发不可预期的逻辑错误。
  • 如果是在各语言的MongoDB驱动中使用$function,同样需要将函数体作为字符串传入,不能直接传入对应语言的函数、闭包对象。

内容的提问来源于stack exchange,提问作者Andy Huang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 03:06:17