如何在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内操作即可:
- 打开Mongo Shell,切换到目标数据库:
use your_database_name(替换为你的数据库名) - 粘贴上述修正后的函数代码,按回车执行
- 直接调用函数:
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
相关产品推荐
相关产品推荐

