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
相关产品推荐
相关产品推荐

