Update 操作详解
适用版本: v1.0.8+
最后更新: 2026-01-15
📋 目录
1. 概述
monSQLize 提供了三种 update 方法:
从 v1.0.8 开始,所有 update 方法都支持聚合管道语法,提供更强大的字段计算和转换能力。
2. 传统更新操作符
2.1 常用操作符
$set - 设置字段值
$unset - 删除字段
$inc - 增加/减少数值
$push - 向数组添加元素
$pull - 从数组移除元素
2.2 组合使用
3. 聚合管道更新 (v1.0.8+)
3.1 基础概念
什么是聚合管道更新?
聚合管道更新允许你在 update 操作中使用聚合表达式,支持:
- ✅ 字段间计算(引用其他字段)
- ✅ 条件表达式($cond、$switch)
- ✅ 数组操作($arrayElemAt、$slice)
- ✅ 字符串操作($concat、$trim)
- ✅ 日期计算($add、$subtract)
- ✅ 多阶段转换(多个 $set/$unset)
MongoDB 版本要求: MongoDB 4.2+
3.2 基本语法
3.3 支持的操作符
3.4 使用场景
场景1: 字段间计算 ⭐
需求: 订单总价 = 单价 × 数量 + 运费
为什么用聚合管道?
- ✅ 一次操作完成计算
- ✅ 避免先查询再计算
- ✅ 服务端计算,减少网络往返
场景2: 条件赋值 ⭐
需求: 根据积分自动设置会员等级
为什么用聚合管道?
- ✅ 复杂条件判断
- ✅ 原子操作,避免竞态条件
- ✅ 代码更简洁
场景3: 数组操作 ⭐
需求: 提取数组第一个元素作为默认值
场景4: 字符串拼接 ⭐
需求: 生成全名字段
场景5: 日期计算 ⭐
需求: 设置过期时间(创建时间 + 30天)
场景6: 多阶段转换 ⭐
需求: 数据清洗、计算、时间戳更新
场景7: 复杂业务逻辑 ⭐
需求: 订单状态自动流转
3.5 与传统方式对比
4. 使用场景对比
4.1 何时使用传统操作符?
✅ 适用场景:
- 简单的字段赋值(
$set、$unset) - 数值增减(
$inc) - 数组元素添加/删除(
$push、$pull) - 不需要字段间计算
示例:
4.2 何时使用聚合管道?
✅ 适用场景:
- 需要引用其他字段值
- 需要条件表达式(if/switch)
- 需要复杂的数组/字符串/日期操作
- 需要多阶段数据转换
示例:
5. 最佳实践
5.1 选择合适的方法
5.2 合理使用多阶段
5.3 错误处理
5.4 性能优化
使用索引
避免过度复杂的表达式
6. 性能考虑
6.1 性能对比
6.2 性能建议
-
简单操作优先用传统操作符
-
复杂计算才用聚合管道
-
批量更新使用 updateBatch
7. 常见问题
Q1: 聚合管道会自动转换 ObjectId 吗?
A: 不会。聚合管道中的字符串保持原样,不会自动转换为 ObjectId。
Q2: 聚合管道支持哪些表达式操作符?
A: 支持大部分聚合表达式操作符,包括:
- 算术:
$add,$subtract,$multiply,$divide,$mod - 条件:
$cond,$switch,$ifNull - 数组:
$arrayElemAt,$size,$slice,$filter - 字符串:
$concat,$substr,$trim,$toUpper,$toLower - 日期:
$dateToString,$year,$month,$dayOfMonth - 类型:
$type,$convert,$toDouble,$toString
完整列表请参考: MongoDB 聚合表达式
Q3: 空数组会报错吗?
A: 会。空数组不是有效的聚合管道。
Q4: 如何调试聚合管道?
A: 使用日志记录和分阶段测试。
Q5: 聚合管道更新后缓存会失效吗?
A: 会。与传统更新操作一样,聚合管道更新后会自动失效相关缓存。
相关文档
文档版本: v1.0.0
适用于: monSQLize v1.0.8+
最后更新: 2026-01-15