MongoDB权限问题:拥有root角色仍无法执行copyTo命令
解决MongoDB
copyTo() 权限报错的问题 嘿,我来帮你搞定这个问题!你遇到的权限错误其实和copyTo()这个方法的底层实现有关,哪怕你拥有root角色也会踩这个坑,下面给你拆解原因和靠谱的替代方案:
为啥会出现这个权限错误?
首先得说,copyTo()是MongoDB早就废弃的方法(从3.0版本开始就不推荐用了),它底层是靠$eval命令在服务器端跑JavaScript脚本来复制数据。而$eval要求用户必须在目标数据库拥有eval权限——哪怕你是admin库的root用户,如果连接时没正确认证到GenericSurveyTool库,或者root角色的权限没覆盖到该库的eval权限,就会触发这个错误码13的权限不足提示。
靠谱的替代方案
别再用copyTo()了,试试这两种更安全高效的方法:
方法1:用聚合管道的$out操作符(推荐)
这是MongoDB官方推荐的集合复制方式,直接在数据库内部完成,不需要服务器端脚本,权限要求也更合理:
// 先切换到目标数据库 use GenericSurveyTool // 执行聚合复制所有文档到新集合 db.surveyquestion.aggregate([ { $match: {} }, // 这里可以加过滤条件,留空就是复制所有文档 { $out: "surveyquestionV2" } ])
只要你对源集合有读权限、对目标库有写权限就能执行,你的root角色完全满足这个要求。
方法2:用mongodump+mongorestore命令行工具
如果集合数据量很大,或者需要跨实例复制,用命令行工具会更稳定:
# 第一步:导出源集合 mongodump --db GenericSurveyTool --collection surveyquestion --out ./survey_dump # 第二步:导入到新集合 mongorestore --db GenericSurveyTool --collection surveyquestionV2 ./survey_dump/GenericSurveyTool/surveyquestion.bson
执行的时候记得用你的moiz用户认证(因为用户是在admin库创建的):
# 带认证的导出命令 mongodump --username moiz --password your_password --authenticationDatabase admin --db GenericSurveyTool --collection surveyquestion --out ./survey_dump
额外要注意的点
- 连接MongoDB时,要么先切换到
GenericSurveyTool库,要么认证时指定--authenticationDatabase admin,确保你的root权限能覆盖到目标库。 - 彻底放弃
copyTo()吧,官方已经不再维护这个方法,后续版本说不定直接移除了。
内容的提问来源于stack exchange,提问作者Abdul Moiz
相关产品推荐
相关产品推荐

