MongoDB Cheat Sheet
1. 核心概念对比
| MongoDB 概念 | 关系型数据库 (SQL) 对应 | 描述 |
|---|---|---|
| Database (数据库) | Database | 集合的容器。 |
| Collection (集合) | Table (表) | 数据库中的一组文档。 |
| Document (文档) | Row (行) | 集合中的一条记录。不同文档不必拥有相同的结构。 |
| Field (字段) | Column (列) | 文档中的键值对。Field 可以是 JSON 对象或数组。 |
2. 安装与启动
- Windows:
$ choco install mongodb -y - Linux:
- Redhat:
sudo yum install -y mongodb-org - Ubuntu/Debian:
sudo apt-get update; sudo apt-get install -y mongodb-org - Fedora:
sudo dnf install mongodb-org
- Redhat:
- Mac:
- 安装:
brew tap mongodb/brew; brew install mongodb-community - 启动:
brew services start mongodb-community
- 安装:
3. Shell 基本命令
所有命令通常在 mongosh 环境中执行:
mongosh: 连接到本地实例。show dbs/show databases: 显示所有数据库。use <dbname>: 切换到指定数据库。db: 显示当前所在的数据库名称。show collections: 显示当前库中的所有集合 。cls: 清屏。db.dropDatabase(): 删除当前数据库。
4. CRUD 操作
创建 (Create)
- 插入单条:
db.collection.insertOne({name: "老杨"}) - 插入多条:
db.collection.insertMany([{name: "李四"}, {name: "王五"}])
读取 (Read)
- 查询所有:
db.collection.find() - 条件查询:
db.collection.find({name: "老杨"}) - 指定字段返回 (Projection):
db.collection.find({name: "老杨"}, {name: 1, email: 1})(1表示返回,0表示不返回) - 查询单条:
db.collection.findOne({level: 1})(只返回第一条匹配的) - 统计:
db.collection.countDocuments({condition}) - 修饰符:
.sort({field: 1}): 1为升序,-1为降序。.limit(n): 限制返回 n 条。.skip(n): 跳过前 n 条。
更新 (Update)
- 命令:
updateOne: 更新匹配的第一条。updateMany: 更新匹配的所有条。replaceOne: 完全替换匹配的文档。save: 替换已有文档或插入新文档。
- 常用操作符:
$set: 更新指定字段,不影响其他字段。$inc: 递增/递减字段值。$rename: 重命名字段。$unset: 删除字段。$push: 向数组添加元素 (不排重)。$addToSet: 向数组添加元素 (排重,若存在则不加)。$pull: 从数组移除元素。
删除 (Delete)
deleteOne: 删除匹配的第一条。deleteMany: 删除匹配的所有条。
5. 过滤操作符 (Filter Operators)
| 类型 | 操作符 | 描述 |
|---|---|---|
| 比较 | $eq / $ne |
等于 / 不等于。 |
$gt / $gte |
大于 / 大于等于。 | |
$lt / $lte |
小于 / 小于等于。 | |
$in / $nin |
值在列表内 / 值不在列表内。 | |
| 逻辑 | $and |
所有条件均为真。 |
$or |
至少一个条件为真。 | |
$not |
条件取反。 | |
| 元素 | $exists |
检查字段是否存在。 |
6. 进阶查询:$expr (表达式)
$expr 允许在 find 查询中使用聚合表达式。这是处理复杂查询(如字段间比较)的关键工具。
核心功能
- 字段间比较: 对比同一个文档中的 A 字段和 B 字段。
- 使用聚合函数: 在普通查询中使用
$size,$cond等聚合操作符。
语法注意
- 在
$expr内部引用字段时,必须加上$前缀 (例如"$price"而不是"price")。
常见场景示例
场景 1:查找字段 A 大于 字段 B 的文档
(例如:查找支出 spent 超过预算 budget 的记录)
1 | db.finance.find({ |
场景 2:基于数组长度查询 (例如:数组长度 > 1)
普通查询无法直接对数组长度做 $gt 判断,必须使用 $expr 配合 $size。
1 | db.Asset.find({ |
7. 聚合 (Aggregation)
用于数据处理和计算,通常通过管道 (pipeline) 进行。
- 常用阶段与操作符:
$sum: 计算总和。$avg: 计算平均值。$min/$max: 获取最值。$first/$last: 获取第一条/最后一条文档数据。$push: 在聚合过程中将值加入数组。