在众触,大多数时候是更新x
里的数据,可以省略x.
不写,但更新y
里的内容时y.
不能省略。
字段操作符
$set | 赋值,省略不写。 { 姓名: "张三", 年龄: 18 } 本是 { $set: { "x.姓名": "张三", "x.年龄": 18 } } { x: $f.x } 用表单数据整体替换x 里的内容 |
$unset | 删除字段,$set的反操作。 { $unset: { "x.价格": "", "x.库存": "" } } 删除价格和库存字段 |
$inc | increment:增加指定值。 { $inc: { "x.价格": 1, "x.库存": -2 } } 价格加1,库存减2 |
$mul | multiply:乘以指定值。 { $mul: { "x.价格": 0.8 } } 价格打8折 |
$min | 取新旧值的最小值(当新值小于当前字段值时才更新数据)。 { $min: { "x.价格": 10 } } 如果原价已小于10则不更新,即最贵不超过10元。 |
$max | 取新旧值的最大值(当新值大于当前字段值时才更新数据)。 { $max: { "x.价格": 10 } } 如果原价已大于10则不更新,即最便宜也得10元。 |
$rename | 重命名。 { $rename: { "x.姓名": "x.昵称" } } 把姓名字段改成昵称。 |
$copy | 复制。 { $copy: { "x.姓名": "y.昵称" } } 新字段y.昵称将拥有x.姓名一样的值。 |
数组操作符
$push | 添加到数组末尾。 { $push: { "x.标签": "电器" } } :添加一个标签 { $push: { "x.标签": ["电器", “食品“] } } :添加多个项目 { $push: { "x.成绩": { 科目: "数学", 分数: 95 } } } :添加一门科目的成绩 |
$unshift | 添加到数组开头。 |
$pop | 删除数组的最后一项。 { $pop: { "x.成绩": "" } } |
$shift | 删除数组的第一项。 { $shift: { "x.成绩": "" } } |
$pull | 删除符合条件的数组元素。 { $pull: { "x.标签": "电器" } } 移除标签数组中的电器 { $pull: { "x.成绩": { 科目: "数学", 分数: { $lt: 60 } } } } 移除不及格的数学成绩 |
$sets | 更新符合条件的对象数组。 { $sets: { "x.成绩": [{ 科目: "数学", 分数: { $lt: 60 } }, { 分数: 60 }] } } 把所有不及格的数学成绩统一设为60分 |
* 避免同时更新同一个路径。
例如 { $inc: { "x.年龄": 2 }, "x.年龄": 0 }:后一个操作会覆盖前一个操作。
例如 { $rename: { "x.姓名": "x.昵称" }, "x.姓名": "张三" }:会报SQL错误:对同一列"x"进行了多次分配
。
特别要注意的是$unset更新的是它的上一级路径,例如 { $unset: { "x.昵称": "" }, "x.姓名": "张三" } 也会报相同的错误。