学习mongodb,体会mongodb的每一个使用细节,欢迎阅读威赞的文章。这是威赞发布的第69篇mongodb技术文章,欢迎浏览本专栏威赞发布的其他文章。如果您认为我的文章对您有帮助或者解决您的问题,欢迎在文章下面点个赞,或者关注威赞。谢谢。
定义
在update操作中,使用$push操作符向数组中插入新的元素。按照下面的语法,使用$push操作符
{$push: {<field1>: <value1>, ...}}
当向嵌入式文档或数组中的数组字段插入元素时,使用点操作符。
行为
- 自mongodb5.0开始,UPDATE操作按照字段名称的字典顺序更新字段。当字段中包含数字时,按照数字顺序依次更新字段。当然,对一个文档的多个字段操作,是原子性的。
- 使用$push向文档不存在的字段插入元素时,update操作向文档中插入该字段并将$push中的指定值赋给新增加的字段。
- 使用$push向非数组字段添加新的元素,数据更新操作会失败。
- 向指定字段使用$push插入数组时,Mongodb的数据更新操作将即将插入的数组作为整体,插入到目标数组当中。如果用户计划使用$push插入指定数组的每一个元素,需要使用$each操作符。
- mongodb 5.0版本以后,向$push传入空表达式({ })时,mongodb不再抛出错误。空表达式不会修改字段值 ,也不会在oplog中,添加新的操作记录。
- Mongodb提供了几个可以与$push搭配使用的数据操作符
操作符 | 描述 |
$each | 向指定数组一次性添加多个元素 |
$slice | 限制操作数组的容量,需要和$each操作符搭配使用 |
$sort | 对指定数组进行排序,需要和$each操作符搭配使用 |
$position | 指定新元素在数组中插入的位置,需要和$each操作符搭配使用。默认新的元素插入到数组的结尾 |
当执行$push操作时,当用户指定对数组排序或限制数组长度时,update按照下面的顺序执行$push操作。
应用
创建students集合并插入数据
db.students.insertOne({_id:1,scores: [44,78,38,80]})
向数组中插入元素
db.students.updateOne({_id:1},{$push: {scores: 89}})
将指定数值插入多个文档的数组字段中
向students集合插入新文档
db.students.insertMany([
{_id:2,scores: [45,78,38,80,89]},
{_id:3,scores: [46,78,38,80,89]},
{_id:4,scores: [47,78,38,80,89]},
])
构建UPDATE语句,向students所有文档的scores字段插入新值95
db.students.updateMany({},{$push: {scores: 95}})
向数组中插入多个数值
在$push中使用$each操作符,将多个值插入数组中。
db.students.updateOne({_id:1},{$push: {scores: {$each: [90, 92, 85]}}})
在$push操作符中使用多个数组更新操作符
向students集合中插入文档
db.students.insertMany([
{_id:5, quizzes: [
{wk:1, score: 10},
{wk:2, score: 8},
{wk:3, score: 5},
{wk:4, score: 6}
]}
])
构建数据更新语句,完成下面几个操作
- 使用$each操作符,向quizzes字段插入多个元素
- 按照score倒序将quizzes中的元素进行排列
- 使用$slice限制quizzes数组的容量,保留排序后前面3个元素
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
}
}
}
)