mongosh 是 MongoDB 官方推出的新一代 Shell 工具,从 MongoDB 6.0 开始已经完全取代了老的 mongo 客户端。相比旧版,mongosh 基于 Node.js 构建,支持语法高亮、命令自动补全和历史记录搜索,用起来顺手得多。本文把日常开发和运维中最常用到的命令做了系统梳理,从连接数据库、切换库表,到文档的增删改查、索引管理和聚合查询,每一条都配上可直接复制运行的示例。

一、连接数据库与基础操作
先说连接。最基本的方式是直接在命令行输入 mongosh,不带参数时会连接本机默认端口 27017。如果数据库部署在远程服务器或者开启了认证,就需要指定完整连接串:
mongosh "mongodb://localhost:27017" mongosh --host 192.168.1.100 --port 27017 -u admin -p 密码 --authenticationDatabase admin
进入 Shell 之后,最先要掌握的是几个查看类命令。show dbs 列出当前实例下的所有数据库,use mydb 切换到指定数据库(如果不存在,插入第一条数据时会自动创建),show collections 查看当前库中的所有集合,db 单独执行时显示当前所在的数据库。
show dbs // 列出所有数据库 use shop // 切换到 shop 库 show collections // 查看集合列表 db // 显示当前数据库名 db.stats() // 查看当前库的统计信息 db.dropDatabase() // 删除当前数据库(慎用)
需要提醒一点,mongosh 删除数据库没有任何确认提示,执行 db.dropDatabase() 前一定要先执行 db 确认自己没连错库。生产环境建议先做备份再操作。
二、文档的增删改查(CRUD)
CRUD 是日常使用频率最高的部分。插入操作有三个方法:insertOne 插入单条文档,insertMany 插入多条,旧的 insert 虽然还能用但已不推荐。看下面的例子:
db.users.insertOne({ name: "张三", age: 28, city: "北京" })
db.users.insertMany([
{ name: "李四", age: 35, city: "上海" },
{ name: "王五", age: 22, city: "广州" }
])查询方面,find 是核心。不带参数返回全部文档,带条件时使用查询运算符,比如 $gt(大于)、$in(包含于)、$regex(正则匹配)等。格式化输出可以加 pretty(),mongosh 默认输出已经比较易读。
db.users.find() // 查全部
db.users.find({ age: { $gt: 25 } }) // 年龄大于25
db.users.find({ city: { $in: ["北京", "上海"] } })
db.users.findOne({ name: "张三" }) // 查单条
db.users.find().sort({ age: -1 }).limit(5) // 按年龄倒序取前5条
db.users.find({ name: /张/ }) // 正则模糊查询更新操作推荐用 updateOne 和 updateMany,必须配合更新运算符,比如 $set 设置字段、$inc 自增、$unset 删除字段。第三个参数 { upsert: true } 表示找不到匹配文档时就插入一条新记录,这个用法在做数据同步时很实用。
db.users.updateOne({ name: "张三" }, { $set: { age: 29 } })
db.users.updateMany({ city: "北京" }, { $inc: { age: 1 } })
db.users.updateOne(
{ name: "赵六" },
{ $set: { city: "深圳" } },
{ upsert: true }
)删除对应的就是 deleteOne 和 deleteMany。特别强调:不带条件执行 deleteMany({}) 会清空整个集合,属于高危操作,执行前建议先用相同的查询条件跑一遍 find 确认影响范围。
db.users.deleteOne({ name: "王五" })
db.users.deleteMany({ city: "广州" })
db.users.countDocuments({ age: { $gt: 25 } }) // 统计符合条件的文档数三、索引、聚合与常用辅助命令
当数据量上来之后,查询慢多半是缺索引。用 createIndex 创建索引,1 表示升序,-1 表示降序,还可以建复合索引和唯一索引:
db.users.createIndex({ name: 1 }) // 单字段索引
db.users.createIndex({ city: 1, age: -1 }) // 复合索引
db.users.createIndex({ email: 1 }, { unique: true })// 唯一索引
db.users.getIndexes() // 查看已有索引
db.users.dropIndex("name_1") // 删除指定索引
db.users.find({ name: "张三" }).explain("executionStats") // 查看执行计划聚合管道 aggregate 用来做分组统计,相当于 SQL 里的 group by。下面的例子按城市分组统计人数并求平均年龄,$match 过滤、$group 分组、$sort 排序,阶段顺序很关键,把 $match 放前面可以利用索引减少扫描量。
db.users.aggregate([
{ $match: { age: { $gte: 18 } } },
{ $group: { _id: "$city", count: { $sum: 1 }, avgAge: { $avg: "$age" } } },
{ $sort: { count: -1 } }
])最后补充几个运维场景的高频命令:集合的重命名、清空与删除,以及用户权限管理。mongosh 中创建用户要切换到 admin 库,角色 readWrite 只对指定库生效,root 则是超级管理员权限。
db.users.renameCollection("members") // 重命名集合
db.users.deleteMany({}) // 清空集合数据
db.users.drop() // 删除整个集合
use admin
db.createUser({
user: "appuser",
pwd: "your_password",
roles: [ { role: "readWrite", db: "shop" } ]
})
db.getUsers() // 查看用户列表
show logs // 查看日志(最新几条)掌握这些命令后,日常开发调试和大部分运维场景基本都能应付。建议在练习环境里把每个命令亲手跑一遍,尤其注意查询运算符和更新运算符的区别,写错位置是新手最常见的报错原因。
mongosh常用命令MongoDB Shell数据库操作修改时间:2026-09-11 14:00:35