一、基本常用命令
1. 数据库相关
MongoDB中数据库和集合的创建是"惰性创建(lazy creation)策略",只有在真正存入数据后才会持久化。
-
查看所有数据库 :
show dbs或show databases -
切换/创建数据库 :
use 数据库名。若数据库不存在则自动创建,但需要后续插入数据才会真正在磁盘中生成。 -
查看当前数据库 :
db -
删除当前数据库 :
db.dropDatabase()。此操作不可逆,需谨慎使用。
2. 集合相关
-
创建集合 :
db.createCollection("集合名")。你也可以在插入文档时隐式创建集合,这是更常用的方式。 -
查看当前数据库中的所有集合 :
show collections或show tables。 -
删除集合 :
db.集合名.drop()。此操作会永久删除整个集合及其中的所有文档
二、增删改查(CRUD)
增:插入文档
-
插入单个文档 :
db.集合名.insertOne({文档内容})。sqldb.users.insertOne({ name: "张三", age: 25, city: "上海" }) -
插入多个文档 :
db.集合名.insertMany([{文档1}, {文档2}])。sqldb.users.insertMany([ { name: "李四", age: 30, city: "北京" }, { name: "王五", age: 28, city: "深圳" } ])执行后,MongoDB会自动为每个文档生成一个唯一的
_id字段作为主键。
删:删除文档
-
删除匹配的第一个文档 :
db.集合名.deleteOne({条件})。sqldb.users.deleteOne({ name: "张三" }) -
删除所有匹配的文档 :
db.集合名.deleteMany({条件})。如果条件为空对象{},则会删除集合中的所有文档。sqldb.users.deleteMany({ age: { $lt: 25 } }) // 删除所有年龄小于25岁的用户
改:修改文档
-
更新单个文档 :
db.集合名.updateOne({筛选条件}, {更新操作})。 -
更新多个文档 :
db.集合名.updateMany({筛选条件}, {更新操作})。 -
替换整个文档 :
db.集合名.replaceOne({筛选条件}, {新文档内容})。
最常用的更新操作符 $set:只更新指定的字段,其他字段保持不变。
sql
// 更新姓名为"李四"的文档,将其年龄改为31,并新增字段"status"
db.users.updateOne(
{ name: "李四" },
{ $set: { age: 31, status: "active" } }
)
查:查询文档
-
查询所有文档 :
db.集合名.find()。 -
查询第一个匹配的文档 :
db.集合名.findOne({条件})。 -
条件查询 :在
find()中传入筛选条件。 -
投影查询 :在
find()的第二个参数中指定返回哪些字段,1表示返回,0表示不返回(_id默认返回)。sql// 查询年龄为25岁的用户,只返回姓名和城市,不返回_id db.users.find( { age: 25 }, { name: 1, city: 1, _id: 0 } )
三、排序 & 分页
-
排序 :
db.集合名.find().sort({字段: 1 或 -1})。1 代表升序,-1 代表降序。sqldb.users.find().sort({ age: -1 }) // 按年龄降序排列 -
分页 :
limit()用于限制返回的文档数量,skip()用于跳过指定数量的文档。sqldb.users.find().skip(0).limit(5) // 第1页,每页5条 db.users.find().skip(5).limit(5) // 第2页,每页5条注意:
skip()方法在数据量很大时会导致性能问题,因为它需要扫描并跳过前面的所有文档,生产环境中应避免跳过大量数据。
执行顺序 :sort() -> skip() -> limit(),无论你在代码中以何种顺序书写。
四、聚合查询
1. 语法
db.集合名.aggregate([{阶段1}, {阶段2}, ...])。聚合管道是一种数据处理方式,每个阶段都会对数据进行一次转换,然后传递给下一个阶段。
常用的管道阶段:
| 阶段 | 作用 | 类似SQL中的... |
|---|---|---|
$match |
筛选文档,过滤出符合条件的记录 | WHERE 子句 |
$group |
按指定字段分组,并执行聚合计算 | GROUP BY 子句 |
$sort |
排序 | ORDER BY 子句 |
$limit / $skip |
分页控制 | LIMIT / OFFSET |
$lookup |
关联查询其他集合(左连接) | LEFT JOIN 操作 |
$project |
指定输出文档中包含哪些字段 | SELECT 子句中的字段列表 |
2. 测试
sql
// 查询订单集合,筛选出金额大于100的订单,并按用户ID分组计算总金额
db.orders.aggregate([
{ $match: { amount: { $gt: 100 } } }, // 1. 过滤出金额大于100的订单
{ $group: { _id: "$userId", totalAmount: { $sum: "$amount" } } }, // 2. 按userId分组,求和
{ $sort: { totalAmount: -1 } } // 3. 按总金额降序排列
])
五、索引
1. 简介
索引是数据库中一种特殊的数据结构,用于快速定位和检索文档,可以极大地提高查询性能。它类似于书籍的目录,让你无需翻阅整本书就能找到目标内容。
2. 语法
-
创建索引 :
db.集合名.createIndex({字段: 排序方向})。1表示升序索引,-1表示降序索引。sqldb.users.createIndex({ name: 1 }) // 创建单字段索引 db.users.createIndex({ name: 1, age: -1 }) // 创建复合索引 -
查看索引 :
db.集合名.getIndexes()。用于查看集合上已创建的所有索引。 -
删除索引:
-
按名称删除:
db.集合名.dropIndex("索引名称") -
删除所有索引(保留
_id索引):db.集合名.dropIndexes()
-
3. 练习
假设有一个存储用户信息的 users 集合,你经常需要按 email 字段查询用户。你可以为 email 字段创建一个唯一索引:
sql
db.users.createIndex({ email: 1 }, { unique: true })
这样既能加速查询,又能保证邮箱地址的唯一性。
4. 分析索引 (explain)
explain() 方法用于分析查询的执行过程,是判断查询是否使用了索引、是否存在性能瓶颈的重要工具。
sql
db.users.find({ age: { $gt: 18 } }).explain("executionStats")
通过返回结果中的 winningPlan 和 executionStats,你可以判断查询是否使用了索引,以及扫描了多少文档。
5. 选择规则
-
为查询条件、排序和聚合操作中频繁出现的字段创建索引。
-
当多个字段经常同时出现在查询条件中时,优先创建复合索引(一个包含多个字段的索引)。
-
对于高基数的字段(即取值较多的字段,如邮箱地址),索引效果更好;对于取值较少的字段(如性别),索引效果有限。
-
可以使用
hint()强制MongoDB使用你指定的索引。
六、权限机制
创建账号语法
在 admin 数据库中,使用 db.createUser() 方法创建用户。
sql
db.createUser({
user: "用户名",
pwd: "密码",
roles: [{ role: "角色名", db: "授权数据库" }]
})
常用的内置角色包括:
-
root:超级管理员角色,拥有最高权限。 -
readWrite:可读写指定数据库。 -
read:只读指定数据库。 -
userAdminAnyDatabase:可管理所有数据库的用户。
开启验证模式
重要 :必须先创建好管理员账号,再开启身份验证,否则你将无法登录数据库!
1. 添加超级管理员账号
sql
use admin
db.createUser({
user: "myAdmin",
pwd: "mySecurePassword",
roles: [{ role: "root", db: "admin" }]
})
创建完成后,可以关闭MongoDB服务,准备以认证模式重启。
2. 卸载服务(Windows)
bash
sc stop MongoDB # 停止服务
sc delete MongoDB # 删除现有服务
3. 安装需要身份验证的服务
以管理员身份运行CMD,进入 bin 目录后执行:
bash
# mongod --install --dbpath 数据目录 --logpath 日志目录\日志名称
mongod --install --dbpath "D:\MongoDB\mongodb-win32-x86_64-windows-8.2.6\data" --logpath "D:\MongoDB\mongodb-win32-x86_64-windows-8.2.6\logs\mongodb.log" --auth
关键点 :添加了 --auth 参数,表示启用身份验证。
4. 启动服务
bash
net start MongoDB
5. 下载 MongoDB Shell
注意~MongoDB 从 6.0 版本开始,不再默认安装命令行工具 mongosh 。
-
下载 MongoDB Shell
-
访问 MongoDB 官方下载中心:
https://www.mongodb.com/try/download/shell。 -
在 "Platform" 下拉菜单中,选择
Windows 64-bit (8.1+) (MSI),下载 MSI 安装包。使用 MSI 安装包可以省去手动配置环境变量的步骤,更便捷。
-
-
安装 MongoDB Shell
-
运行你下载的 MSI 文件。
-
在安装向导中,当出现 "Custom Setup" 页面时,请务必点击
Browse...按钮 ,将安装路径设置为你的 MongoDB Server 的bin目录,即:D:\MongoDB\mongodb-win32-x86_64-windows-8.2.6\bin。这样做的目的是将mongosh.exe和其他 MongoDB 工具放在一起,方便管理。 -
继续完成安装。
-
-
配置环境变量(如果安装路径不同)
-
如果你在安装时没有选择上面的路径,或者你下载的是
.zip压缩包,则需要手动配置。在 Windows 搜索框输入"环境变量",打开"编辑系统环境变量"。 -
在"系统属性"窗口中,点击"环境变量"。
-
在"系统变量"列表中,找到并选中
Path变量,然后点击"编辑"。 -
在编辑窗口中,点击"新建",然后添加
mongosh的bin文件夹的完整路径(例如:C:\Program Files\mongosh\bin)。如果你在安装时没有修改路径,mongosh的默认安装位置通常是C:\Program Files\mongosh\bin。 -
点击"确定"保存所有窗口。
-
-
验证安装
-
重新打开一个新的命令提示符(CMD)或 PowerShell 窗口。
-
输入
mongosh --version并回车。如果能看到版本信息,就说明安装和环境变量都配置成功了。 -
接着,输入
mongosh并回车,即可连接到本地的 MongoDB 数据库。
-
6. 登录测试
不提供用户名密码直接登录:
bash
mongosh
此时若执行 show dbs,会报权限错误,因为你未通过验证。
7. 通过超级管理员账号登录
bash
mongosh --username myAdmin --password mySecurePassword --authenticationDatabase admin
成功登录后,就可以正常操作数据库了。
8.创建一个拥有特定数据库权限的普通用户
登录超级管理员账号后,为你的应用程序创建一个拥有特定数据库权限的普通用户:
sql
use myAppDB
db.createUser({
user: "appUser",
pwd: "appPassword",
roles: [{ role: "readWrite", db: "myAppDB" }]
})
之后,应用程序就可以使用这个受限账号连接数据库,实现安全隔离。
七、备份还原
下载MongoDB数据库工具
mongodump 和 mongorestore 是官方提供的备份与恢复工具。
-
下载地址 :MongoDB官方网站的下载中心,找到 Database Tools,下载对应操作系统版本的压缩包。
-
使用方法 :解压后,将
mongodump.exe和mongorestore.exe等工具文件复制到MongoDB的bin目录下即可使用。
备份数据库 mongodump
备份时不需要停止MongoDB服务,它是一个热备份工具。
bash
mongodump --out D:\backup\my_backup
常用参数:
-
--out或-o:指定备份文件的输出目录。 -
--db或-d:指定要备份的数据库名称。若不指定,则备份所有数据库。 -
--collection或-c:指定要备份的集合名称。 -
--username/--password:如果开启了身份验证,需要提供认证信息。
bash
mongodump --username myAdmin --password mySecurePassword --authenticationDatabase admin --db myAppDB --out D:\backup\myAppDB
还原数据库 mongorestore
bash
mongorestore --drop D:\backup\my_backup
常用参数:
-
--drop:在恢复前删除目标数据库中已存在的同名集合,确保恢复后的数据与备份时完全一致。 -
--db:指定将备份恢复到哪个数据库中。若不指定,MongoDB会根据备份文件中记录的元数据进行恢复。 -
--username/--password:如果目标数据库开启了身份验证,需要提供认证信息。
注意 :mongodump 生成的备份文件是二进制的BSON格式,保留了数据类型和索引信息,因此推荐使用 mongorestore 进行恢复。mongoexport / mongoimport 则用于导出/导入JSON或CSV格式的数据,适用于数据迁移或与其他系统交换数据。