MongoDB (mongosh) 命令速查
mongosh 快速参考:连接、CRUD、查询运算符、聚合管道、索引、副本集、用户管理与 dump/restore,并附带最常用的 shell 写法与实操示例。
30 条命令
连接与基本信息
mongosh "<uri>"使用标准 URI 连接 MongoDB。
--quiet;--eval 'cmd';--file script.js;--apiVersion 1/2
mongosh "mongodb://app:[email protected]:27017/app_production?authSource=admin"show dbs / use <db> / show collections列出数据库;切换到一个数据库;列出当前库下的集合。
show dbs | use app | show collectionsdb.serverStatus() / db.stats()服务端信息:连接数、操作计数、副本集状态等;db 统计:大小与集合数。
.pretty() 格式化输出;.verbose();.json;--eval 返回结果
db.serverStatus().connections && db.stats().dataSizeCRUD:读取
db.<coll>.find()查询一个集合;可链式调用 .pretty() .limit() .skip() .sort() 整形结果。
.projection({name:1, email:1, _id:0});.sort({createdAt:-1});.limit(20);.skip(20);.count();.allowDiskUse()
db.orders.find({status:'paid', amount:{$gte:10}}).sort({createdAt:-1}).limit(20).pretty()db.<coll>.findOne({...}) / db.<coll>.countDocuments({...})读取单个文档,或统计匹配过滤条件的文档数。
findOne 可带/不带过滤条件;estimatedDocumentCount 是 O(1) 估算
db.users.findOne({email:'[email protected]'}, {pwd:0, _id:0}) && db.orders.countDocuments({status:'paid'})CRUD:创建
db.<coll>.insertOne({...}) / insertMany([...])插入一个或多个文档;选项 ordered:false 时即便出错也会写入剩余合法文档。
db.logs.insertMany([{k:'api', t:new Date()}, {k:'worker', t:new Date()}], {ordered:false})CRUD:更新
db.<coll>.updateOne(filter, update, opts)更新单个文档。可使用 $set $inc $push $pull $addToSet $rename $unset 等运算符。
upsert:true;arrayFilters:[] 用于嵌套数组;returnDocument:'after'(findOneAndUpdate)
db.users.updateOne({email:'[email protected]'}, {$inc:{loginCount:1}, $set:{lastSeen:new Date()}}, {upsert:true})db.<coll>.updateMany(filter, update) / findOneAndUpdate批量更新(底层是 bulk write);findOneAndUpdate 可原子地返回更新前/后的文档。
db.orders.updateMany({status:'pending', createdAt:{$lt:new Date(Date.now()-864e5)}}, {$set:{status:'cancelled'}})CRUD:替换
db.<coll>.replaceOne(filter, replacement)整体替换一个文档(_id 字段不可更改)。
db.users.replaceOne({email:'[email protected]'}, {name:'Alice', email:'[email protected]', role:'admin', tags:['vip']})CRUD:删除
db.<coll>.deleteOne / deleteMany(filter)删除匹配过滤条件的文档;deleteMany({}) 会清空整个集合(谨慎使用)。
db.sessions.deleteMany({lastSeen:{$lt:new Date(Date.now()-7*864e5)}}) && db.orders.deleteOne({_id:ObjectId('...')})查询运算符
比较:$eq / $ne / $gt / $gte / $lt / $lte / $in / $nin标准比较运算符;$in 用于匹配值列表。
db.orders.find({amount:{$gte:10,$lt:100}, status:{$in:['paid','shipped']}})逻辑:$and / $or / $not / $nor组合多个谓词;$not 仅作用于正则/元数据,正则需显式提供。
db.products.find({$or:[{sale:true,price:{$lt:50}},{tags:'vip'}]})$exists / $type / $regex / $expr / $mod字段级谓词:存在性、BSON 类型、正则匹配、聚合表达式比较($expr)、取模($mod)。
db.users.find({email:{$exists:true, $regex:'@example.com$', $options:'i'}})db.<coll>.distinct(field, filter)获取某字段的唯一取值(可附加过滤条件)。
db.orders.distinct('userId', {status:'paid'}).length聚合
.aggregate([...])构造聚合管道:$match → $group → $project → $sort → $limit → $lookup → $unwind → $facet。
.explain('executionStats');allowDiskUse:true;collation 文档
db.orders.aggregate([ { $match:{status:'paid'} }, { $group:{_id:'$userId', gmv:{$sum:'$amount'}, n:{$sum:1}} }, { $sort:{gmv:-1} }, { $limit:50} ])$lookup / $graphLookup跨集合连接($lookup)与递归树遍历($graphLookup)。
db.orders.aggregate([{$lookup:{from:'users', localField:'userId', foreignField:'_id', as:'user'}}, {$unwind:'$user'}, {$project:{total:1, 'user.name':1}}])$bucket / $bucketAuto / $sample / $sortByCount实用聚合阶段:分桶、采样、Top-N 计数。
db.events.aggregate([{$sample:{size:100}}, {$group:{_id:'$kind', n:{$sum:1}}}])索引
db.<coll>.createIndex(spec, opts)创建单字段 / 复合 / 地理 / 全文 / TTL 索引。
{unique:true, partialFilterExpression, sparse, expireAfterSeconds, weights, name}
db.users.createIndex({email:1}, {unique:true}) && db.events.createIndex({ts:1}, {expireAfterSeconds:7*86400}) && db.shops.createIndex({loc:'2dsphere'})db.<coll>.getIndexes() / dropIndex / dropIndexes列出索引;删除单个 / 全部索引(生产环境慎用 dropIndexes)。
db.users.getIndexes().forEach(i=>print(i.name, JSON.stringify(i.key)))db.<coll>.explain('executionStats').find(filter)查看获胜的执行计划与实际统计;关注 COLLSCAN、IXSCAN、FETCH、sort 阶段。
executionStats / queryPlanner / allPlansExecution;verbosity
db.orders.find({userId:42,createdAt:{$gte:new Date('2026-01-01')}}).sort({createdAt:-1}).explain('executionStats').queryPlanner.winningPlandb.<coll>.hint({...})强制优化器使用特定索引——排查坏计划与计划回退。
db.users.find({email:'[email protected]'}).hint({email:1}).explain()运维
db.runCommand({...}) / db.adminCommand / db.command直接执行 MongoDB 命令,覆盖 shell helper 没有覆盖的操作。
db.runCommand({listCollections:1, name:'app'}) && db.adminCommand({listDatabases:1}).databases.lengthdb.revokeRolesFromUser / grantRolesToUser角色管理(在 admin 库下执行)。
use admin; db.createUser({user:'audit',pwd:'...',roles:[{role:'readAnyDatabase',db:'admin'}]})副本集
rs.initiate() / rs.status()初始化单节点副本集;查看副本集健康状态。
rs.initiate({_id:'rs0',members:[{_id:0,host:'m1:27017'}]});rs.status().myState
rs.initiate({_id:'rs0',members:[{_id:0,host:'m1:27017'},{_id:1,host:'m2:27017'},{_id:2,host:'m3:27017'}]})rs.add / rs.remove / rs.stepDown添加 / 移除成员;强制触发一次主节点选举以测试故障切换。
rs.add('m4:27017');rs.remove('m3:27017');rs.stepDown(60)
rs.add('m4.internal:27017') && rs.stepDown(60) && 在下一节点上 sh.status()分片集群
sh.status() / sh.enableSharding查看分片集群拓扑 / 在某个数据库上启用分片。
use admin; sh.enableSharding('analytics'); sh.shardCollection('analytics.events', {userId:1, ts:1})备份与迁移
mongodump / mongorestore逻辑备份 / 恢复。可用 --uri、--db、--archive 流式处理;--gzip 启用压缩。
--gzip;--archive=file.archive;--oplog 用于 PITR;--nsInclude/Exclude
mongodump --uri="mongodb://user:pw@m1:27017/?authSource=admin" --gzip --archive=/backup/app-2026-07-23.archive && mongorestore --gzip --archive=/backup/app.archive --nsInclude='app.*' --dropmongoexport / mongoimport以 JSON 或 CSV 格式导入 / 导出。可作为 Mongo 与其他系统间的格式转换管道。
--type=json|csv;--fields=a,b,c;--headerline;-q 过滤;--jsonArray(顶层数组)
mongoexport --uri="..." -d app -c orders --type=json -q '{"status":"paid"}' --out=orders.json && mongoimport --drop --jsonArray orders.json -d copy -c ordersmongotop / mongostat实时监控:每个集合每秒读 / 写耗时;以及各种统计指标。
interval 秒数;--host
mongostat --host=m1.internal --authdb=admin --username=ops -i 5db.shutdownServer()在 admin 库下执行,干净停止 mongod——也可在 rm / 断电后用于恢复。
use admin;db.shutdownServer()(不支持 force;干净关机会等待 oplog 复制)
use admin; db.shutdownServer()速查页版本 1.0.0
适用于 MongoDB 6.0+ / mongosh 1.6+