MongoDB 基本SQL操作

一、基本常用命令

1. 数据库相关

MongoDB中数据库和集合的创建是"惰性创建(lazy creation)策略",只有在真正存入数据后才会持久化。

  • 查看所有数据库show dbsshow databases

  • 切换/创建数据库use 数据库名。若数据库不存在则自动创建,但需要后续插入数据才会真正在磁盘中生成。

  • 查看当前数据库db

  • 删除当前数据库db.dropDatabase()。此操作不可逆,需谨慎使用。

2. 集合相关
  • 创建集合db.createCollection("集合名")。你也可以在插入文档时隐式创建集合,这是更常用的方式。

  • 查看当前数据库中的所有集合show collectionsshow tables

  • 删除集合db.集合名.drop()。此操作会永久删除整个集合及其中的所有文档

二、增删改查(CRUD)

增:插入文档
  • 插入单个文档db.集合名.insertOne({文档内容})

    sql 复制代码
    db.users.insertOne({ name: "张三", age: 25, city: "上海" })
  • 插入多个文档db.集合名.insertMany([{文档1}, {文档2}])

    sql 复制代码
    db.users.insertMany([
        { name: "李四", age: 30, city: "北京" },
        { name: "王五", age: 28, city: "深圳" }
    ])

    执行后,MongoDB会自动为每个文档生成一个唯一的 _id 字段作为主键。

删:删除文档
  • 删除匹配的第一个文档db.集合名.deleteOne({条件})

    sql 复制代码
    db.users.deleteOne({ name: "张三" })
  • 删除所有匹配的文档db.集合名.deleteMany({条件})。如果条件为空对象 {},则会删除集合中的所有文档。

    sql 复制代码
    db.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 代表降序。

    sql 复制代码
    db.users.find().sort({ age: -1 })  // 按年龄降序排列
  • 分页limit() 用于限制返回的文档数量,skip() 用于跳过指定数量的文档。

    sql 复制代码
    db.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表示降序索引。

    sql 复制代码
    db.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")

通过返回结果中的 winningPlanexecutionStats,你可以判断查询是否使用了索引,以及扫描了多少文档。

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 变量,然后点击"编辑"。

    • 在编辑窗口中,点击"新建",然后添加 mongoshbin 文件夹的完整路径(例如: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数据库工具

mongodumpmongorestore 是官方提供的备份与恢复工具。

  • 下载地址 :MongoDB官方网站的下载中心,找到 Database Tools,下载对应操作系统版本的压缩包。

  • 使用方法 :解压后,将 mongodump.exemongorestore.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格式的数据,适用于数据迁移或与其他系统交换数据。

相关推荐
爬山算法2 小时前
MongoDB(71)如何启用MongoDB身份验证?
数据库·mongodb·oracle
FinTech老王2 小时前
Oracle的CONNECT BY在国产数据库中的实现
数据库·oracle
荒川之神2 小时前
ORACLE逻辑备份
数据库·oracle
xxxibolva11 小时前
SQL 学习
数据库·sql·学习
小韩博16 小时前
代码审计-PHP原生开发篇&SQL注入&数据库监控&正则搜索&文件定位&静态分析
数据库·sql
qq_1969761716 小时前
python的sql解析库-sqlparse
数据库·python·sql
gjc59217 小时前
零基础OceanBase数据库入门(4):创建MySQL模式数据库
数据库·mysql·oracle·oceanbase
知识分享小能手17 小时前
MongoDB入门学习教程,从入门到精通,MongoDB创建副本集知识点梳理(10)
数据库·学习·mongodb
jackiehome18 小时前
SQL数据库无法操作,日志文件损坏修复
数据库·sql·oracle