MongoDB Shell 工具全面对比:mongosh 和 mongo

文章目录

    • [一、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`](#三、迁移方式:从 mongomongosh)
      • [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 连接?)

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 复制代码
// 注意:此功能仍在实验阶段

三、迁移方式:从 mongomongosh

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 开始,避免学习已弃用工具

最终建议

  1. 立即卸载 mongo ,全面转向 mongosh
  2. 在团队中统一使用 mongosh
  3. 利用 async/await 编写更健壮的数据库脚本
  4. 通过 .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"
相关推荐
IvorySQL8 小时前
让源码安装不再困难:IvorySQL 一键安装脚本的实现细节解析
数据库·人工智能·postgresql·开源
云和数据.ChenGuang8 小时前
openGauss赋能新能源汽车智能制造——比亚迪MES系统数据库国产化升级案例
数据库·汽车·opengauss·gaussdb·数据库权限管理
洛小豆8 小时前
她问我:数据库还在存 Timestamp?我说:大人,时代变了
数据库·后端·mysql
邵伯8 小时前
为什么你的 SELECT 有时会阻塞?
数据库·后端
洛小豆8 小时前
代码修仙录 · 第1期:宗门大阵崩了?只因少了毫秒三魂!
数据库·后端·mysql
2501_941886868 小时前
基于法兰克福金融系统实践的高可靠消息队列设计与多语言实现经验总结分享
服务器·前端·数据库
ANnianStriver8 小时前
redis安装包方式下载安装
数据库·redis·缓存
云和恩墨9 小时前
表空间、巡检、建库:DBA最熟悉的3个场景,正在被zCloud开放运维中心重新定义
运维·数据库·表空间·dba·巡检·建库
Austindatabases9 小时前
临时工说:上云后给 我一个 不裁 DBA的理由
数据库·dba
IT邦德9 小时前
为什么顶尖DBA,都爱混社交圈?
数据库·dba