Loading...

文章背景图

MongoDB

2025-06-30
0
-
- 分钟
|

一、连接与基础入门

1.1 连接MongoDB Shell

操作

命令

说明

本地连接

mongoshmongo

默认连接到 mongodb://127.0.0.1:27017

指定主机和端口

mongosh --host <host> --port <port>

连接远程MongoDB服务器

带认证连接

mongosh -u <username> -p <password> --authenticationDatabase admin

使用用户名密码认证连接

MongoDB Atlas连接

mongosh "mongodb+srv://cluster-name.abcde.mongodb.net/" --username <username>

连接MongoDB Atlas云服务

查看当前数据库

db

打印当前使用的数据库名称

查看所有数据库

show dbsshow databases

列出所有有权限查看的数据库

切换数据库

use <database>

切换到指定数据库,不存在则自动创建

查看所有集合

show collectionsshow tables

列出当前数据库中的所有集合

运行JavaScript文件

load("myScript.js")

加载并执行外部JavaScript文件

退出Shell

exitquit

退出MongoDB Shell

1.2 帮助与信息命令

操作

命令

说明

查看帮助

help

显示Shell级别的帮助信息

数据库方法帮助

db.help()

显示数据库对象的所有可用方法

集合方法帮助

db.collection.help()

显示集合对象的所有可用方法

查看MongoDB版本

db.version()

返回当前MongoDB服务器版本

查看主机信息

db.hostInfo()

返回服务器主机信息

查看服务器状态

db.serverStatus()

返回服务器运行状态统计


二、数据库管理命令

操作

命令

说明

创建/切换数据库

use <database>

MongoDB中数据库在首次插入数据时才会真正创建

查看当前数据库

db

返回当前使用的数据库名称

查看所有数据库

show dbs

列出所有数据库及其大小

查看数据库统计

db.stats()

返回当前数据库的统计信息(集合数、索引数、数据大小等)

删除当前数据库

db.dropDatabase()

删除当前使用的数据库,谨慎操作

修复数据库

db.repairDatabase()

修复并压缩数据库,回收磁盘空间

克隆数据库

db.cloneDatabase("<hostname>")

从远程服务器复制整个数据库

复制数据库

db.copyDatabase("<from_db>", "<to_db>")

将源数据库复制到目标数据库

保留数据库说明

  • admin:权限根数据库,存储用户认证和角色信息

  • local:存储本地单服务器数据,永远不会被复制

  • config:用于分片设置时保存分片相关信息


三、集合(Collection)管理命令

操作

命令

说明

显式创建集合

db.createCollection("<name>")

手动创建集合

隐式创建集合

直接向不存在的集合插入文档

推荐方式,集合会自动创建

查看所有集合

show collections

列出当前数据库中的所有集合

重命名集合

db.<collection>.renameCollection("<new_name>")

重命名集合

查看集合统计

db.<collection>.stats()

返回集合的详细统计信息

查看集合大小

db.<collection>.dataSize()

返回集合数据占用的字节数

查看集合总大小

db.<collection>.totalSize()

返回集合数据+索引的总大小

查看集合存储大小

db.<collection>.storageSize()

返回集合分配的存储空间大小

删除集合

db.<collection>.drop()

删除集合,返回true表示成功

验证集合

db.<collection>.validate()

验证集合数据完整性


四、文档CRUD操作

4.1 插入文档(Create)

操作

命令

说明

插入单文档

db.<collection>.insertOne({…})

插入一条文档,返回包含_id的结果

插入多文档

db.<collection>.insertMany([{…}, {…}])

批量插入多条文档

通用插入

db.<collection>.insert({…})

可插入单条或多条文档

无序批量插入

db.<collection>.insertMany([…], {ordered: false})

某条失败继续插入其余文档

带写入关注

db.<collection>.insert({…}, {writeConcern: {w: "majority", wtimeout: 5000}})

指定写入确认级别

插入示例

// 插入单条文档
db.users.insertOne({
    name: "张三",
    age: 25,
    email: "zhangsan@example.com",
    tags: ["developer", "mongodb"],
    create_time: new Date()
})

// 批量插入
db.users.insertMany([
    {name: "李四", age: 30, email: "lisi@example.com"},
    {name: "王五", age: 28, email: "wangwu@example.com"}
])

注意:若未指定_id字段,MongoDB会自动生成ObjectId类型的主键。整型需用NumberInt()声明,否则默认为double类型。

4.2 查询文档(Read)

操作

命令

说明

查询所有文档

db.<collection>.find()

返回所有文档(返回20条,输入it显示更多)

格式化输出

db.<collection>.find().pretty()

美化JSON格式输出

查询单文档

db.<collection>.findOne({…})

返回第一个匹配的文档

条件查询

db.<collection>.find({field: value})

按字段值查询

投影查询

db.<collection>.find({}, {field1: 1, field2: 0})

1表示显示,0表示隐藏

排序查询

db.<collection>.find().sort({field: 1/-1})

1升序,-1降序

限制数量

db.<collection>.find().limit(n)

返回前n条文档

跳过文档

db.<collection>.find().skip(n)

跳过前n条文档

分页查询

db.<collection>.find().limit(n).skip(m)

每页n条,跳过m条

统计数量

db.<collection>.countDocuments({…})

精确计数

估算数量

db.<collection>.estimatedDocumentCount()

基于元数据快速估算

去重查询

db.<collection>.distinct("field")

返回字段的去重值数组

查看执行计划

db.<collection>.find({…}).explain("executionStats")

分析查询性能

4.3 比较运算符

运算符

说明

示例

$eq

等于

{age: {$eq: 25}}

$ne

不等于

{age: {$ne: 25}}

$gt

大于

{age: {$gt: 25}}

$gte

大于等于

{age: {$gte: 25}}

$lt

小于

{age: {$lt: 25}}

$lte

小于等于

{age: {$lte: 25}}

$in

在列表中

{tags: {$in: ["mongodb", "database"]}}

$nin

不在列表中

{tags: {$nin: ["mysql"]}}

4.4 逻辑运算符

运算符

说明

示例

$and

逻辑与

{$and: [{age: {$gt: 20}}, {age: {$lt: 30}}]}

$or

逻辑或

{$or: [{name: "张三"}, {age: 25}]}

$nor

逻辑或非

{$nor: [{price: 1.99}, {sale: true}]}

$not

逻辑非

{age: {$not: {$gt: 25}}}

4.5 元素运算符

运算符

说明

示例

$exists

字段是否存在

{email: {$exists: true}}

$type

按字段类型查询

{age: {$type: "int"}}{age: {$type: 16}}

4.6 数组运算符

运算符

说明

示例

$all

包含所有指定元素

{tags: {$all: ["mongodb", "database"]}}

$elemMatch

至少一个元素匹配所有条件

{scores: {$elemMatch: {$gte: 80, $lt: 90}}}

$size

数组长度匹配

{tags: {$size: 3}}

4.7 更新文档(Update)

操作

命令

说明

更新单文档

db.<collection>.updateOne({filter}, {$set: {field: value}})

更新匹配的第一条文档

更新多文档

db.<collection>.updateMany({filter}, {$set: {field: value}})

更新所有匹配的文档

替换文档

db.<collection>.replaceOne({filter}, {new_doc})

用新文档完全替换旧文档

通用更新

db.<collection>.update({filter}, {update}, {upsert: true})

支持更多选项

更新并返回

db.<collection>.findOneAndUpdate({filter}, {update}, {returnNewDocument: true})

返回更新后的文档

更新操作符

操作符

说明

示例

$set

设置字段值

{$set: {age: 26}}

$unset

删除字段

{$unset: {temp_field: ""}}

$inc

数值递增/递减

{$inc: {count: 1, score: -5}}

$mul

数值乘法

{$mul: {price: 1.1}}

$rename

重命名字段

{$rename: {"old_name": "new_name"}}

$min

比较后取最小值更新

{$min: {lowScore: 50}}

$max

比较后取最大值更新

{$max: {highScore: 95}}

$currentDate

设置当前日期

{$currentDate: {lastModified: true}}

数组更新操作符

操作符

说明

示例

$push

向数组添加元素

{$push: {tags: "new_tag"}}

$addToSet

去重后添加

{$addToSet: {tags: "unique_tag"}}

$pop

移除首/尾元素

{$pop: {tags: 1}}(1尾,-1首)

$pull

移除匹配元素

{$pull: {tags: "old_tag"}}

$pullAll

移除多个元素

{$pullAll: {tags: ["a", "b"]}}

$each

批量操作数组

{$push: {tags: {$each: ["a", "b"]}}}

4.8 删除文档(Delete)

操作

命令

说明

删除单文档

db.<collection>.deleteOne({filter})

删除匹配的第一条文档

删除多文档

db.<collection>.deleteMany({filter})

删除所有匹配的文档

删除并返回

db.<collection>.findOneAndDelete({filter})

删除并返回被删除的文档

删除所有文档

db.<collection>.deleteMany({})

删除集合中所有文档(不删除集合)

通用删除

db.<collection>.remove({filter}, {justOne: true})

传统删除方法


五、索引管理命令

5.1 索引操作

操作

命令

说明

创建单字段索引

db.<collection>.createIndex({field: 1})

1升序,-1降序

创建复合索引

db.<collection>.createIndex({field1: 1, field2: -1})

多字段组合索引

创建唯一索引

db.<collection>.createIndex({field: 1}, {unique: true})

确保字段值唯一

创建文本索引

db.<collection>.createIndex({field: "text"})

支持全文搜索

创建地理空间索引

db.<collection>.createIndex({location: "2dsphere"})

支持地理位置查询

创建哈希索引

db.<collection>.createIndex({field: "hashed"})

用于分片

创建TTL索引

db.<collection>.createIndex({date: 1}, {expireAfterSeconds: 3600})

文档自动过期

创建部分索引

db.<collection>.createIndex({field: 1}, {partialFilterExpression: {field: {$gt: 0}}})

只索引符合条件的文档

查看所有索引

db.<collection>.getIndexes()

列出集合的所有索引

查看索引大小

db.<collection>.totalIndexSize()

返回所有索引的总大小

删除指定索引

db.<collection>.dropIndex("index_name")

按名称删除索引

删除所有索引

db.<collection>.dropIndexes()

删除除_id外的所有索引

隐藏索引

db.<collection>.hideIndex("index_name")

隐藏索引(4.4+),测试后决定是否删除

显示索引

db.<collection>.unhideIndex("index_name")

取消隐藏索引

重建索引

db.<collection>.reIndex()

重建集合上的所有索引

5.2 索引类型速查

索引类型

命令示例

适用场景

单字段索引

db.users.createIndex({age: 1})

单字段查询

复合索引

db.users.createIndex({age: 1, name: -1})

多字段组合查询

多键索引

自动创建

数组字段索引

文本索引

db.articles.createIndex({content: "text"})

全文搜索

地理空间索引

db.places.createIndex({loc: "2dsphere"})

地理位置查询

哈希索引

db.users.createIndex({user_id: "hashed"})

分片键

TTL索引

db.logs.createIndex({createdAt: 1}, {expireAfterSeconds: 86400})

自动过期删除

唯一索引

db.users.createIndex({email: 1}, {unique: true})

确保值唯一


六、聚合管道(Aggregation Pipeline)

6.1 聚合框架

聚合管道是MongoDB数据分析的核心工具,基于数据处理流水线的概念,文档经过多个阶段(Stage)的处理,最终输出聚合结果。

6.2 常用管道阶段(Stage)

阶段

说明

示例

$match

过滤文档(类似WHERE)

{$match: {status: "active"}}

$group

分组并执行聚合计算

{$group: {_id: "$category", total: {$sum: 1}}}

$project

选择/重命名字段(类似SELECT)

{$project: {name: 1, age: 1, _id: 0}}

$sort

排序

{$sort: {age: -1}}

$limit

限制输出数量

{$limit: 10}

$skip

跳过指定数量

{$skip: 10}

$unwind

展开数组字段

{$unwind: "$tags"}

$lookup

关联查询(类似JOIN)

{$lookup: {from: "orders", localField: "_id", foreignField: "user_id", as: "orders"}}

$addFields

添加新字段

{$addFields: {fullName: {$concat: ["$first", " ", "$last"]}}}

$count

统计文档数量

{$count: "total"}

$out

将结果写入新集合

{$out: "new_collection"}

$merge

将结果合并到现有集合

{$merge: {into: "target", on: "_id"}}

$facet

多维度分组

{$facet: {group1: […], group2: […]}}

$bucket

按区间分组

{$bucket: {groupBy: "$age", boundaries: [0, 18, 30, 50, 100]}}

$sortByCount

按计数排序分组

{$sortByCount: "$category"}

6.3 常用聚合表达式操作符

操作符

说明

示例

$sum

求和

{$sum: "$price"}

$avg

求平均值

{$avg: "$age"}

$min

最小值

{$min: "$score"}

$max

最大值

{$max: "$score"}

$push

将所有值放入数组

{$push: "$name"}

$addToSet

去重后放入数组

{$addToSet: "$tag"}

$first

取第一个值

{$first: "$name"}

$last

取最后一个值

{$last: "$name"}

$concat

字符串连接

{$concat: ["$first", " ", "$last"]}

$substr

子字符串

{$substr: ["$name", 0, 3]}

$toUpper

转大写

{$toUpper: "$name"}

$toLower

转小写

{$toLower: "$name"}

$year

提取年份

{$year: "$date"}

$month

提取月份

{$month: "$date"}

$dayOfMonth

提取日期

{$dayOfMonth: "$date"}

$cond

条件表达式

{$cond: {if: {$gte: ["$score", 60]}, then: "pass", else: "fail"}}

6.4 聚合示例

// 统计每个年龄段的人数
db.users.aggregate([
    { $group: { _id: "$age", count: { $sum: 1 } } },
    { $sort: { _id: 1 } }
])

// 关联查询:获取用户及其订单
db.users.aggregate([
    { $match: { status: "active" } },
    { $lookup: {
        from: "orders",
        localField: "_id",
        foreignField: "user_id",
        as: "orders"
    }},
    { $project: { name: 1, email: 1, orderCount: { $size: "$orders" } } }
])

// 电影平均评分
db.reviews.aggregate([
    { $group: { _id: "$movie_id", averageRating: { $avg: "$rating" } } }
])

七、用户与权限管理命令

7.1 用户管理

操作

命令

说明

创建用户

db.createUser({user: "username", pwd: "password", roles: […]})

在admin库中创建用户

查看所有用户

db.getUsers()show users

列出当前数据库的所有用户

查看指定用户

db.getUser("username")

查看用户的详细信息

修改密码

db.changeUserPassword("username", "new_password")

修改用户密码

更新用户

db.updateUser("username", {roles: […]})

更新用户角色和属性

删除用户

db.dropUser("username")

删除指定用户

删除所有用户

db.dropAllUsers()

删除当前数据库的所有用户

用户认证

db.auth("username", "password")

验证用户身份

创建管理员用户示例

use admin
db.createUser({
    user: "admin",
    pwd: "secure_password",
    roles: ["root"]
})

7.2 角色管理

操作

命令

说明

创建自定义角色

db.createRole({role: "role_name", privileges: […], roles: […]})

定义细粒度权限

查看角色

db.getRole("role_name")

查看角色详细信息

查看所有角色

db.getRoles()

列出当前数据库所有角色

更新角色

db.updateRole("role_name", {privileges: […]})

修改角色权限

授予角色

db.grantRolesToUser("username", [{role: "role_name", db: "db_name"}])

给用户授予角色

撤销角色

db.revokeRolesFromUser("username", [{role: "role_name", db: "db_name"}])

撤销用户的角色

删除角色

db.dropRole("role_name")

删除自定义角色

7.3 常用内置角色

角色

级别

说明

root

全局

超级管理员,所有操作权限

read

数据库

只读权限

readWrite

数据库

读写权限

dbAdmin

数据库

数据库管理(索引、统计等)

userAdmin

数据库

用户管理权限

dbOwner

数据库

数据库所有者(readWrite+dbAdmin+userAdmin)

clusterAdmin

集群

集群管理权限

clusterManager

集群

集群监控管理

clusterMonitor

集群

集群只读监控

backup

集群

备份权限

restore

集群

恢复权限

readAnyDatabase

全局

所有数据库只读

readWriteAnyDatabase

全局

所有数据库读写

userAdminAnyDatabase

全局

所有数据库用户管理

dbAdminAnyDatabase

全局

所有数据库管理


八、副本集管理命令

8.1 副本集初始化与配置

操作

命令

说明

初始化副本集

rs.initiate()

初始化新的副本集

初始化指定配置

rs.initiate({_id: "rs0", members: [{_id: 0, host: "host:port"}]})

带配置初始化

查看副本集配置

rs.conf()

返回副本集配置文档

重新配置

rs.reconfig(config)

应用新的副本集配置

查看副本集状态

rs.status()

返回副本集状态信息

查看主节点状态

rs.printReplicationInfo()

从主节点角度查看状态

查看从节点状态

rs.printSlaveReplicationInfo()

查看从节点同步状态

8.2 副本集成员管理

操作

命令

说明

添加成员

rs.add("host:port")

向副本集添加新成员

添加仲裁节点

rs.addArb("host:port")

添加只参与投票的仲裁节点

移除成员

rs.remove("host:port")

从副本集移除成员

降级主节点

rs.stepDown()

强制主节点降级为从节点

冻结节点

rs.freeze(seconds)

阻止节点在一定时间内成为主节点

设置同步源

rs.syncFrom("host:port")

手动设置从节点的同步源

重新同步

db.adminCommand({resync: 1})

强制从节点重新同步数据

8.3 副本集状态命令

操作

命令

说明

检查当前节点角色

db.isMaster()rs.isMaster()

返回节点角色信息

查看oplog信息

db.getReplicationInfo()

查看oplog大小和时间范围

查看从节点信息

db.printSlaveReplicationInfo()

查看所有从节点同步状态

强制选举

rs.stepDown()db.adminCommand({replSetStepDown: 60})

触发新选举


九、分片集群管理命令

操作

命令

说明

添加分片

sh.addShard("rs0/host:port")

向集群添加分片

查看分片状态

sh.status()

查看分片集群状态

启用数据库分片

sh.enableSharding("<database>")

对数据库启用分片

分片集合

sh.shardCollection("<db>.<collection>", {shard_key: 1})

对集合进行分片

添加标签

sh.addShardTag("shard_name", "tag")

为分片添加标签

查看均衡器状态

sh.getBalancerState()

查看均衡器是否开启

开启/关闭均衡器

sh.startBalancer() / sh.stopBalancer()

控制数据均衡

移动数据块

sh.moveChunk("<db>.<collection>", {shard_key: value}, "target_shard")

手动迁移数据块


十、备份与恢复命令

10.1 mongodump / mongorestore

操作

命令

说明

备份所有数据库

mongodump --out /backup/path

导出所有数据库

备份指定数据库

mongodump --db <db_name> --out /backup/path

导出指定数据库

备份指定集合

mongodump --db <db_name> --collection <coll_name> --out /backup/path

导出指定集合

带认证备份

mongodump -u <user> -p <password> --authenticationDatabase admin --out /backup/path

认证后备份

压缩备份

mongodump --gzip --archive=backup.gz

压缩格式备份

恢复所有数据库

mongorestore /backup/path

恢复所有数据库

恢复指定数据库

mongorestore --db <db_name> /backup/path/<db_name>

恢复指定数据库

恢复指定集合

mongorestore --db <db_name> --collection <coll_name> /backup/path/file.bson

恢复指定集合

带认证恢复

mongorestore -u <user> -p <password> --authenticationDatabase admin /backup/path

认证后恢复

从压缩文件恢复

mongorestore --gzip --archive=backup.gz

从压缩文件恢复

10.2 mongoexport / mongoimport

操作

命令

说明

导出为JSON

mongoexport --db <db_name> --collection <coll_name> --out file.json

导出为JSON格式

导出为CSV

mongoexport --db <db_name> --collection <coll_name> --type=csv --fields field1,field2 --out file.csv

导出为CSV格式

带查询导出

mongoexport --db <db_name> --collection <coll_name> --query '{field: value}' --out file.json

按条件导出

导入JSON

mongoimport --db <db_name> --collection <coll_name> --file file.json

导入JSON文件

导入CSV

mongoimport --db <db_name> --collection <coll_name> --type=csv --headerline --file file.csv

导入CSV文件

批量导入

mongoimport --db <db_name> --collection <coll_name> --file file.json --numInsertionWorkers 4

多线程导入


十一、性能监控与诊断命令

11.1 性能监控

操作

命令

说明

查看当前操作

db.currentOp()

查看正在执行的操作

终止操作

db.killOp(opid)

终止指定操作

查看慢查询

db.getProfilingStatus()

查看性能分析器状态

设置性能分析级别

db.setProfilingLevel(level, slowms)

0-关闭,1-只记录慢查询,2-记录所有操作

查看慢查询日志

db.system.profile.find().pretty()

查询性能分析记录

查看集合统计

db.<collection>.stats()

返回集合的详细统计

查看数据库统计

db.stats()

返回数据库统计信息

查看服务器状态

db.serverStatus()

返回服务器运行状态

11.2 诊断命令

操作

命令

说明

查看锁信息

db.serverStatus().locks

查看锁状态

查看连接数

db.serverStatus().connections

查看当前连接数

查看内存使用

db.serverStatus().mem

查看内存使用情况

查看网络统计

db.serverStatus().network

查看网络流量统计

查看oplog统计

db.getReplicationInfo()

查看oplog信息

查看存储引擎统计

db.serverStatus().wiredTiger

WiredTiger引擎统计

诊断数据库

db.runCommand({dbStats: 1, scale: 1024})

获取数据库统计(KB单位)

验证集合

db.<collection>.validate({full: true})

完整验证集合数据


十二、数据类型速查

类型

说明

示例

String

字符串

"hello"

Integer

32位整数

NumberInt(100)

Long

64位整数

NumberLong("10000000000")

Double

双精度浮点数

100.5

Boolean

布尔值

true / false

ObjectId

自动生成的主键

ObjectId("507f1f77bcf86cd799439011")

ISODate

日期时间

ISODate("2024-01-01T00:00:00Z")

Timestamp

时间戳

Timestamp(1234567890, 1)

Array

数组

["a", "b", "c"]

Object

嵌套文档

{name: "张三", age: 25}

Null

空值

null

Binary Data

二进制数据

BinData(0, "base64string")

Regular Expression

正则表达式

/{regex}/

JavaScript

JavaScript代码

function() {…}

Decimal128

高精度小数

NumberDecimal("100.55")

MinKey / MaxKey

最小/最大值

MinKey / MaxKey

评论交流

文章目录