一、基本用法
以下修饰符可用于更新操作,例如,db.collection.updateMany()
和 db.collection.findAndModify()
,更新文档语法格式:
{
<operator1>: { <field1>: <value1>, ... },
<operator2>: { <field2>: <value2>, ... },
...
}
二、常用运算符
从 5.0
版本开始,处理字段顺序按照字典字段名称排列顺序,有数字名称的按数字顺序处理。在 4.4
以前版本是按照字典排列顺序处理。
{$set: {"a.2": <new value>, "a.10": <new value>,}}
2.1 字段操作
名称 | 描述 |
---|---|
$currentDate |
将字段值设置为当前日期,日期或者时间戳 |
$inc |
字段值自增多少 |
$min |
更新值小于字段值则更新 |
$max |
更新值大于字段值则更新 |
$mul |
当前字段 *= 指定的值 |
$rename |
重命名字段 |
$set |
设置文档字段值 |
$setOnInsert |
更新不存在的文档时,指定插入文档某些字段的默认值 |
$unset |
删除字段 |
2.3 数组操作
名称 | 描述 |
---|---|
$ |
占位符,表示查询条件匹配到的第一个元素 |
$[] |
占位符,查询条件匹配的所有元素 |
$[<indentifier>] |
占位符,更新满足条件的所有元素,indentifier 用于表示 arrayFilters 的匹配规则名称。 |
$addToSet |
数组中不存在时才添加 |
$pop |
删除数组第一个或最后一个元素 |
$pull |
删除满足条件的所有元素 |
$push |
添加到数组 |
$pullAll |
从数组中删除所有匹配的值。 |
修饰运算符
名称 | 描述 |
---|---|
$each |
指定 $push 和 $addToSet 追加的元素列表 |
$position |
指定 $push 时元素添加位置 |
$slice |
限制数组大小,0 表示空数组,大于 0 表示保留前面 N 个元素,小于0 表示保留后面 N 个元素 |
$sort |
对数组按指定字段重新排序 |
2.4 位运算
名称 | 描述 |
---|---|
$bit |
执行整数值的按位AND ,OR ,XOR 更新。 |
三、示例
3.1 $currentDate
将字段更新为当前日期
{$currentDate: {field: true}}
// {$set: { lastModified: "$$NOW"}}
3.2 $inc
将字段值增加指定量
db.products.updateOne(
{ sku: "abc123" },
{ $inc: { quantity: -2, "metrics.orders": 1 } }
)
3.3 $min
若更新值低于元素值,则更新
db.scores.updateOne( { _id: 1 }, { $min: { lowScore: 150 } } )
// 若原始值 lowScore 高于 150,则更新为 150
3.4 $max
若更新值大于原始值,则更新
db.scores.updateOne( { _id: 1 }, { $max: { highScore: 950 } } )
// 若原始值 highScore 低于 950,则更新为 950
日期也可以进行比较
db.tags.updateOne(
{ _id: 1 },
{ $max: { dateExpired: new Date("2013-09-30") } }
)
3.5 $mul
将字段的值乘以一个数字后再更新
db.products.updateOne(
{ _id: 1 },
{ $mul:
{
price: Decimal128( "1.25" ),
quantity: 2
}
}
)
3.6 $rename
修改字段名
db.students.updateOne(
{ _id: 1 },
{ $rename: { 'nickname': 'alias', 'cell': 'mobile' } }
)
若能重命名字段不存在,不执行任何操作。
3.7 $set
db.products.updateOne(
{ _id: 100 },
{ $set:
{
quantity: 500,
details: { model: "2600", make: "Fashionaires" },
tags: [ "coats", "outerwear", "clothing" ]
}
}
)
3.8 $setOnInsert
如果更新操作导致插入文档,则将指定的值分配给文档中的字段。如果 更新操作不会导致插入,不执行任何操作。
db.products.updateOne(
{ _id: 1 },
{
$set: { item: "apple" },
$setOnInsert: { defaultQty: 100 }
},
{ upsert: true }
)
3.9 $unset
运算符删除特定字段。
db.products.updateOne(
{ sku: "unknown" },
{ $unset: { quantity: "", instock: "" } }
)
// 删除字段: quantity,instock
3.10 数组更新($)运算符
$
标识要更新数组中元素的位置,不需要显示指定
// 测试数据
db.students.insertMany( [
{ "_id" : 1, "grades" : [ 85, 80, 80 ] },
{ "_id" : 2, "grades" : [ 88, 90, 92 ] },
{ "_id" : 3, "grades" : [ 85, 100, 90 ] }
])
// 执行更新
db.students.updateOne(
{ _id: 1, grades: 80 },
{ $set: { "grades.$" : 82 } }
)
// 更新后
{ "_id" : 1, "grades" : [ 85, 82, 80 ] }
{ "_id" : 2, "grades" : [ 88, 90, 92 ] }
{ "_id" : 3, "grades" : [ 85, 100, 90 ] }
标识将 grades
数组中第一个元素值为80的更新为82。$
这里标识要第一个满足更新条件元素的下标位置。
提示
若更新的数组元素是文档,可以使用 {array.$.field: value}
的形式进行更新。
3.11 数组更新($[])运算符
$[]
和 $
一样也是位置占位符,不同的是 $[]
表示所有满足更新条件的元素,而 $
仅表示第一个。
db.collection.updateOne(
{ myArray: [ 5, 8 ] },
{ $set: { "myArray.$[]": 10 } },
{ upsert: true }
)
该操作将把所有满足条件的文档中的 myArray
数组中元素值为 5 和 8 的都更新为 10。
db.students.updateMany(
{ },
{ $inc: { "grades.$[]": 10 } },
)
表示把所有满足条件的文档中的 grades
数组中的所有元素自增 10。
3.12 数组更新筛选占位运算符
$[<identifier>]
该运算符叫筛选占位符,用于表示满足筛选条件的元素,配合 arrayFilters
使用。
db.collection.updateOne(
{ myArray: [ 0, 1 ] },
{ $set: { "myArray.$[element]": 2 } },
{ arrayFilters: [ { element: 0 } ], upsert: true }
)
element
表示筛选规则名称,表示 arrayFilters
筛选出需要更新的元素。嵌套数组的更新:
db.students4.updateMany(
{},
{ $inc: { "grades.$[t].questions.$[score]": 2 } },
{ arrayFilters: [ { "t.type": "quiz" }, { "score": { $gte: 8 } } ] }
)
3.13 数组更新($addToSet)运算符
向数组中添加一个值,若该值已存在不执行任何操作。
db.pigments.updateOne(
{ _id: 1 },
{ $addToSet: { colors: "mauve" } }
)
3.14 数组更新($poo)运算符
删除数组中第一个或者最后一个元素:
// 删除第一个
db.students.updateOne( { _id: 1 }, { $pop: { scores: } } )
// 删除最后一个
db.students.updateOne( { _id: 1 }, { $pop: { scores: -1 } } )
3.15 数组更新($pull)运算符
$pull
将删除多个匹配的元素:
db.stores.updateMany(
{ },
{ $pull: { fruits: { $in: [ "apples", "oranges" ] }, vegetables: "carrots" } }
)
$in
删除多个,单个直接写在后面。或者直接删除满足条件的元素:
db.profiles.updateOne( { _id: 1 }, { $pull: { votes: { $gte: 6 } } } )
3.16 数组更新($push)运算符
$push
向数组追加元素
// 追加单个
db.students.updateOne(
{ _id: 1 },
{ $push: { scores: 89 } }
)
// 追加多个
db.students.updateOne(
{ name: "joe" },
{ $push: { scores: { $each: [ 90, 92, 85 ] } } }
)
// 指定位置追加元素
db.students.updateOne(
{ _id: 1 },
{
$push: {
scores: {
$each: [ 50, 60, 70 ],
$position: 0
}
}
}
)
// 追加后排序,并现在保留个数
db.students.updateOne(
{ _id: 5 },
{
$push: {
quizzes: {
$each: [ { wk: 5, score: 8 }, { wk: 6, score: 7 }, { wk: 7, score: 6 } ],
$sort: { score: -1 },
$slice: 3
}
}
}
)
// $slice=0,空数组,$slice>1保留前面三个,$slice<1保留最后面3个。
3.17 数组更新($pullAll)运算符
$pullAll
删除指定元素:
db.survey.updateOne( { _id: 1 }, { $pullAll: { scores: [ 0, 5 ] } } )
// 元素为0或者5的都会被删除