首页/数据/NoSQL 速查/mongosh 执行脚本与 --eval
MongoDB99 条

mongosh 执行脚本与 --eval

非交互执行:--eval 就地跑一段 JS,或把 .js 文件作为参数执行;--quiet 去掉横幅,适合放进脚本与流水线。

NoSQL 速查数据更新于 2026-10-13

非交互执行怎么用

mongosh 除了交互式 shell,还支持两种非交互方式:用 --eval 就地执行一段 JavaScript,或把 .js 文件当参数传给它执行。加上 --quiet 可以去掉启动横幅,输出更干净,适合放进运维脚本、定时任务与 CI 流程。

基本信息

用途在 shell、定时任务或 CI 中非交互执行 MongoDB 操作
关键选项--eval、--quiet、--host、--port、--username、--password、脚本文件名
连接串写法也可以直接把 mongodb:// 连接串作为第一个参数
退出码执行出错时返回非零,可以用来判断任务是否成功
脚本文件复杂逻辑写成 .js 文件,比命令行拼接引号可靠得多

典型使用场景

  • 定时任务里执行统计或清理脚本
  • CI 流水线中检查索引与集合状态
  • 批量维护:遍历集合校验或修正数据
  • 把一段查询封装成脚本交给同事复用
  • 自动化校验:根据输出内容或退出码判定结果

常用写法

常用写法
# 就地执行一段 JS,--quiet 去掉启动横幅
mongosh --quiet --eval "db.orders.countDocuments({status:'paid'})"

# 指定连接串与库后执行
mongosh "mongodb://app:secret@127.0.0.1:27017/app?authSource=app" --quiet --eval "db.stats().dataSize"

# 执行脚本文件,逻辑复杂时优先这种方式
mongosh "mongodb://127.0.0.1:27017/app" --quiet maintain.js

# 输出 JSON,便于上层脚本解析
mongosh --quiet --eval "JSON.stringify(db.users.findOne({_id:1}))"

# 用退出码判断执行结果
mongosh --quiet --eval "db.users.countDocuments({})" ; echo $?

常用选项

选项作用注意
--eval就地执行一段 JS引号层数多时容易出错
--quiet去掉启动横幅与提示CI 输出更干净
--host / --port指定目标实例与连接串写法二选一
脚本文件名执行 .js 文件复杂逻辑优先用这种方式
--username / --password认证参数更推荐写在连接串里并显式带 authSource
--eval 外层用双引号时内部字符串要用单引号,避免被 shell 提前解释;含 $ 的聚合管道建议写进 .js 文件再执行。
脚本文件方式比长命令行可靠:美元符号、引号与括号都不会被 shell 处理,脚本还能纳入版本管理,出问题可以回溯改动。

易错点

  • 复杂命令里的 $ 字符会被 shell 展开成变量,优先写入 .js 文件再执行
  • 命令里引号层数多时容易搞混哪层归 shell、哪层归 JavaScript 字符串,出错时先把语句单独放进文件调试
  • 在 --eval 里写多行语句:shell 的分号与换行处理与交互模式不同,复杂逻辑应落到脚本文件
  • 脚本里把外部输入直接拼进查询条件,存在注入与误删风险,命令行脚本同样要做输入校验

数据来源与参考

  • MongoDB Manual: mongosh usage
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌