如何运行存储在MongoDB文档中的JavaScript函数
问题原因
- 存储类型不匹配:你插入的函数实际被序列化为了包含
code字段的普通对象,并非BSON原生的JavaScript类型,因此用$type: "javascript"无法匹配到对应文档。 - 服务端默认不支持直接执行文档内嵌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
相关产品推荐
相关产品推荐

