非交互执行怎么用
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 处理,脚本还能纳入版本管理,出问题可以回溯改动。