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

如何在MongoDB Shell中执行自定义函数?遇loadServerScripts/db.eval报错

问题与解决方案

一、先修正你的函数错误

你编写的函数存在关键问题:element对象中的属性值用了字符串"$doc.education",这会把字符串本身存入数据库,而非读取doc对象的对应属性值。修正后的函数如下:

function loadEducation() {
    const bulkInsert = db.education.initializeUnorderedBulkOp();
    const documents = db.summaryData.find({});

    documents.forEach(function (doc) {
        const element = {
            education: doc.education, 
            education_num: doc.education_num
        };
        // 以element的属性作为查询条件,匹配则替换,不匹配则插入
        bulkInsert.find({ education: doc.education, education_num: doc.education_num }).upsert().replaceOne(element);
    });
    bulkInsert.execute();
    return true;
}

如果使用MongoDB高版本,更推荐用现代的bulkWrite写法:

function loadEducation() {
    const operations = [];
    db.summaryData.find({}).forEach(doc => {
        operations.push({
            replaceOne: {
                filter: { education: doc.education, education_num: doc.education_num },
                replacement: { education: doc.education, education_num: doc.education_num },
                upsert: true
            }
        });
    });
    db.education.bulkWrite(operations);
    return true;
}

二、Mongo Shell中直接测试的方法

无需往db.system.js存储函数,直接在Shell内操作即可:

  1. 打开Mongo Shell,切换到目标数据库:use your_database_name(替换为你的数据库名)
  2. 粘贴上述修正后的函数代码,按回车执行
  3. 直接调用函数:loadEducation(),即可执行数据迁移操作

三、关于db.loadServerScripts和db.eval失效的原因

  • db.loadServerScripts()在MongoDB 4.4版本开始被弃用,后续版本已完全移除该方法
  • db.eval()自MongoDB 4.2版本起被弃用,高版本不再支持
    因此你使用这些方法会报错,当前推荐的做法就是直接在Shell中定义函数并调用,或者将函数写入脚本文件,通过mongo your_script.js命令执行。

内容的提问来源于stack exchange,提问作者Hoang Minh Quang FX15045

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 08:15:42