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

如何运行存储在MongoDB文档中的JavaScript函数

问题原因

  1. 存储类型不匹配:你插入的函数实际被序列化为了包含code字段的普通对象,并非BSON原生的JavaScript类型,因此用$type: "javascript"无法匹配到对应文档。
  2. 服务端默认不支持直接执行文档内嵌JS:出于安全和性能考虑,MongoDB的普通查询、聚合管道都不会自动解析执行文档中存储的函数字符串,你在聚合中写的$functiontest.code()属于无效语法,不会触发函数执行。

正确调用方法

方法1:客户端(mongo shell侧)执行(推荐)

先将目标文档查询到本地,再转换为函数执行,全程不需要修改服务端配置,无安全风险:

// 1. 查询获取目标文档
const targetDoc = db.Test.findOne({_id: ObjectId("618d4096dc79465b4196551b")});
// 2. 将code字段的函数字符串转为可执行函数
const execFunc = eval(`(${targetDoc.functiontest.code})`);
// 3. 调用函数获取返回值
const returnVal = execFunc();
// 输出结果为 Hello
print(returnVal);

方法2:服务端执行(不推荐)

仅MongoDB 4.4及更早版本支持,需要提前在配置中开启security.javascriptEnabled参数,5.0及以上版本已经完全废弃服务端JS存储和执行相关特性:

db.Test.aggregate([
  {
    $project: {
      codeMe: {
        $function: {
          body: "$functiontest.code",
          args: [],
          lang: "js"
        }
      }
    }
  }
])

警告:服务端执行用户可控的JS代码存在严重的注入风险,且会大幅降低查询性能,非特殊需求不要使用。

补充:正确存储BSON JavaScript类型

如果你需要用$type: "javascript"匹配存储的函数,插入时需要显式使用Code构造函数声明类型:

db.Test.insertOne({
  functiontest: new Code("function(){return 'Hello';}")
});

内容的提问来源于stack exchange,提问作者dt delhi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 20:45:06