文章目录
-
- [一、mongosh 和 mongo 对比](#一、mongosh 和 mongo 对比)
-
- [1.1 核心对比总览](#1.1 核心对比总览)
- [1.2 安装方式差异](#1.2 安装方式差异)
- [1.3 常用指令对比](#1.3 常用指令对比)
- [1.4 配置文件与个性化](#1.4 配置文件与个性化)
- [1.5 性能与调试能力对比](#1.5 性能与调试能力对比)
- 二、脚本编程对比
-
- [2.1 基础脚本(两者兼容)](#2.1 基础脚本(两者兼容))
- [2.2 异步操作(仅 `mongosh` 支持)](#2.2 异步操作(仅
mongosh支持)) - [2.3 错误处理增强(`mongosh`)](#2.3 错误处理增强(
mongosh)) - [2.4 模块化脚本(`mongosh`)](#2.4 模块化脚本(
mongosh))
- [三、迁移方式:从 `mongo` 到 `mongosh`](#三、迁移方式:从
mongo到mongosh) -
- [3.1 步骤 1:检查现有脚本兼容性](#3.1 步骤 1:检查现有脚本兼容性)
- [3.2 步骤 2:升级不兼容代码](#3.2 步骤 2:升级不兼容代码)
- [3.3 步骤 3:利用新特性重构](#3.3 步骤 3:利用新特性重构)
- [3.4 使用建议](#3.4 使用建议)
- 四、常见问题解答
-
- [4.1 Q1: 能否在 `mongosh` 中使用旧版 `mongo` 的所有命令?](#4.1 Q1: 能否在
mongosh中使用旧版mongo的所有命令?) - [4.2 Q2: 为什么 `mongosh` 启动更慢?](#4.2 Q2: 为什么
mongosh启动更慢?) - [4.3 Q3: 如何在 CI/CD 中使用 `mongosh`?](#4.3 Q3: 如何在 CI/CD 中使用
mongosh?) - [4.4 Q4: `mongosh` 是否支持 TLS/SSL 连接?](#4.4 Q4:
mongosh是否支持 TLS/SSL 连接?)
- [4.1 Q1: 能否在 `mongosh` 中使用旧版 `mongo` 的所有命令?](#4.1 Q1: 能否在
mongosh 是 MongoDB 官方推出的 现代化、功能更强大、交互体验更好 的命令行 shell 工具,自 MongoDB 4.4 起逐步取代旧版 mongo shell,并从 MongoDB 5.0 开始成为唯一官方支持的 shell。下面是各种对比和使用方式
一、mongosh 和 mongo 对比
1.1 核心对比总览
| 特性 | mongo(旧版 Shell) |
mongosh(新版 Shell) |
|---|---|---|
| 状态 | ❌ 已弃用(MongoDB 5.0+ 移除) | ✅ 官方唯一支持 |
| 首次发布 | MongoDB 1.0 (2009) | MongoDB 4.4 (2020) |
| 底层引擎 | SpiderMonkey (Mozilla JS 引擎) | Node.js + V8 |
| JavaScript 支持 | ES5 | ES2021+(含 async/await) |
| 语法高亮 | ❌ 无 | ✅ 有(彩色输出) |
| 智能补全 | 基础(仅方法名) | ✅ 高级(含集合字段、操作符) |
| TypeScript 支持 | ❌ | ✅ 内置类型定义(开发中) |
| 插件系统 | ❌ | ✅ 支持(实验性) |
| 异步操作 | ❌ 不支持 | ✅ 支持 await(需在 async 上下文) |
| 默认安装 | MongoDB ≤ 4.4 | MongoDB ≥ 5.0 |
| 跨平台一致性 | 一般 | ✅ 极高(基于 Node.js) |
| 安全更新 | 停止维护 | 持续更新 |
结论 :所有新项目必须使用
mongosh,旧项目建议尽快迁移。
1.2 安装方式差异
1、mongo(仅适用于旧版本 MongoDB)
bash
# Ubuntu/Debian (MongoDB 4.4)
sudo apt install mongodb-org-shell
# CentOS/RHEL (MongoDB 4.4)
sudo yum install mongodb-org-shell
2、mongosh(推荐!)
bash
# 独立安装(与 MongoDB 版本解耦)
# Linux
curl -O https://downloads.mongodb.com/compass/mongosh-2.2.0-linux-x64.tar.gz
tar -xzf mongosh-*.tar.gz
sudo mv mongosh-*/ /opt/mongosh
sudo ln -s /opt/mongosh/bin/mongosh /usr/local/bin/
# 或通过包管理器
sudo yum install mongodb-mongosh # RHEL/CentOS
sudo apt install mongodb-mongosh # Debian/Ubuntu
brew install mongosh # macOS
winget install MongoDB.Shell # Windows
1.3 常用指令对比
✅ 表示兼容,⚠️ 表示行为差异,❌ 表示不支持
| 功能 | mongo |
mongosh |
说明 |
|---|---|---|---|
| 连接数据库 | mongo localhost:27017/mydb |
✅ 同左 | 完全兼容 |
| 认证登录 | mongo -u admin -p --authenticationDatabase admin |
✅ 同左 | 完全兼容 |
| 显示数据库 | show dbs |
✅ 同左 | 完全兼容 |
| 切换数据库 | use mydb |
✅ 同左 | 完全兼容 |
| 显示集合 | show collections |
✅ 同左 | 完全兼容 |
| 查询数据 | db.users.find().pretty() |
✅ 同左 | 完全兼容 |
| 插入数据 | db.users.insert({name:"Tom"}) |
✅ 同左 | 完全兼容 |
| 删除集合 | db.users.drop() |
✅ 同左 | 完全兼容 |
| 查看帮助 | help / db.help() |
✅ 同左 | 完全兼容 |
| 执行脚本 | mongo script.js |
✅ mongosh script.js |
兼容 |
| 加载文件 | load("util.js") |
✅ 同左 | 完全兼容 |
| 退出 Shell | exit / Ctrl+D |
✅ 同左 | 完全兼容 |
| 分页查看 | it |
✅ 同左 | 完全兼容 |
| 异步操作 | ❌ | ✅ await db.runCommand(...) |
重大增强 |
| Promise 支持 | ❌ | ✅ 原生支持 | 可写现代 JS |
| 语法高亮 | ❌ | ✅ 彩色输出 | 提升可读性 |
| 字段自动补全 | ❌ | ✅ 输入 db.users. 后按 Tab 显示字段 |
开发效率提升 |
1.4 配置文件与个性化
1、配置文件位置
| 平台 | mongo |
mongosh |
|---|---|---|
| Linux/macOS | ~/.mongorc.js |
~/.mongoshrc.js |
| Windows | %USERPROFILE%\.mongorc.js |
%USERPROFILE%\.mongoshrc.js |
2、示例配置(.mongoshrc.js)
js
// 自定义提示符
prompt = () => {
const user = db.runCommand({ connectionStatus: 1 }).authInfo.authenticatedUserRoles;
const role = user.length ? user[0].role : 'none';
return `[${db.getName()}@${role}]> `;
};
// 快捷函数
function countAll() {
db.getCollectionNames().forEach(coll => {
const n = db[coll].countDocuments();
print(`${coll}: ${n}`);
});
}
// 自动连接常用数据库
if (db.getName() === 'test') {
use('myapp'); // mongosh 新语法
}
print("✨ Welcome to mongosh! Type 'countAll()' to see collection sizes.");
💡
mongosh新增use('dbname')函数,可在脚本中切换数据库。
1.5 性能与调试能力对比
| 能力 | mongo |
mongosh |
|---|---|---|
| 执行时间统计 | ❌ | ✅ :timing 命令 |
| 内存使用监控 | ❌ | ✅ db.serverStatus().mem |
| 操作日志 | ❌ | ✅ 内置日志(~/.mongodb/mongosh.log) |
| 调试器集成 | ❌ | ✅ 支持 Chrome DevTools(实验性) |
mongosh 时间统计示例:
js
// 开启计时
:timing
// 执行查询
db.orders.find({ status: "shipped" }).count();
// 输出:Elapsed time: 120ms
二、脚本编程对比
2.1 基础脚本(两者兼容)
insert_users.js
js
// 两者均可运行
const users = [
{ name: "Alice", age: 30 },
{ name: "Bob", age: 25 }
];
users.forEach(user => {
db.users.insertOne(user);
});
print(`Inserted ${users.length} users.`);
运行:
bash
mongosh mydb insert_users.js # 推荐
# 或(旧版)
mongo mydb insert_users.js
2.2 异步操作(仅 mongosh 支持)
async_query.js
js
// 仅 mongosh 支持!
(async () => {
try {
// 使用 await 等待结果
const result = await db.users.aggregate([
{ $match: { age: { $gt: 25 } } },
{ $count: "total" }
]).toArray();
if (result.length > 0) {
print(`Users over 25: ${result[0].total}`);
}
// 异步执行命令
const buildInfo = await db.runCommand({ buildInfo: 1 });
print(`MongoDB Version: ${buildInfo.version}`);
} catch (error) {
print(`Error: ${error}`);
}
})();
⚠️在
mongo中运行会报错:ReferenceError: await is not defined
2.3 错误处理增强(mongosh)
js
// mongosh 支持 try/catch 捕获数据库错误
try {
db.users.insertOne({ _id: 1, name: "Dup" });
db.users.insertOne({ _id: 1, name: "Dup" }); // 会失败
} catch (e) {
if (e.code === 11000) { // E11000 duplicate key error
print("Duplicate key detected!");
}
}
2.4 模块化脚本(mongosh)
利用 Node.js 的 require(实验性,需启用):
js
// utils.js
exports.formatUser = (user) => {
return `${user.name} (${user.age})`;
};
// main.js
const utils = require('./utils');
const user = db.users.findOne();
print(utils.formatUser(user));
🔧 启用模块支持(在
.mongoshrc.js中):
js// 注意:此功能仍在实验阶段
三、迁移方式:从 mongo 到 mongosh
3.1 步骤 1:检查现有脚本兼容性
- 99% 的基础 CRUD 脚本无需修改
- 移除任何依赖 SpiderMonkey 特性的代码
3.2 步骤 2:升级不兼容代码
旧代码(mongo) |
新代码(mongosh) |
|---|---|
db.eval("...") |
❌ 已废弃,改用聚合或应用层逻辑 |
ObjectId().str |
✅ 仍支持,但推荐 ObjectId().toString() |
printjson(obj) |
✅ 仍支持,但 print(JSON.stringify(obj, null, 2)) 更灵活 |
3.3 步骤 3:利用新特性重构
js
// 旧:回调风格(mongo 不支持)
// 无法实现
// 新:使用 async/await(mongosh)
const processOrders = async () => {
const orders = await db.orders.find({ processed: false }).toArray();
for (const order of orders) {
await processOrder(order); // 假设这是个异步函数
await db.orders.updateOne({ _id: order._id }, { $set: { processed: true } });
}
};
processOrders();
3.4 使用建议
| 场景 | 推荐方案 |
|---|---|
| 新项目开发 | ✅ 直接使用 mongosh |
| 旧项目维护 | 将 mongo 脚本迁移到 mongosh |
| 自动化脚本 | ✅ mongosh --file script.js |
| 生产环境诊断 | ✅ mongosh + 异步操作 + 错误处理 |
| 学习 MongoDB | ✅ 从 mongosh 开始,避免学习已弃用工具 |
最终建议:
- 立即卸载
mongo,全面转向mongosh- 在团队中统一使用
mongosh- 利用
async/await编写更健壮的数据库脚本- 通过
.mongoshrc.js提升团队开发效率
四、常见问题解答
4.1 Q1: 能否在 mongosh 中使用旧版 mongo 的所有命令?
是的 。mongosh 完全向后兼容 mongo 的交互式命令和脚本语法。
4.2 Q2: 为什么 mongosh 启动更慢?
因为基于 Node.js,首次启动需加载 V8 引擎。可通过 --nodb 参数快速进入 shell:
bash
mongosh --nodb
4.3 Q3: 如何在 CI/CD 中使用 mongosh?
yaml
# GitHub Actions 示例
- name: Install mongosh
run: |
wget https://downloads.mongodb.com/compass/mongosh-2.2.0-linux-x64.tar.gz
tar -xzf mongosh-*.tar.gz
echo "$(pwd)/mongosh-*/bin" >> $GITHUB_PATH
- name: Run DB script
run: mongosh $MONGODB_URI --file deploy.js
4.4 Q4: mongosh 是否支持 TLS/SSL 连接?
完全支持,用法与 mongo 相同:
bash
mongosh "mongodb://host:27017/?tls=true&tlsCAFile=/path/ca.pem"