$push
定义
$push
$push
操作符将指定值附加到数组中。
兼容性
可以使用 $push
查找托管在以下环境中的部署:
MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务
MongoDB Enterprise:基于订阅、自我管理的 MongoDB 版本
MongoDB Community:源代码可用、免费使用且可自行管理的 MongoDB 版本
语法
$push
操作符具有如下形式:
{ $push: { <field1>: <value1>, ... } }
要在嵌入式文档或数组中指定 <field>
,请使用点符号。
行为
从 MongoDB 5.0 开始,更新操作符按字典顺序处理具有基于字符串的名称的文档字段。具有数字名称的字段按数字顺序处理。详情请参阅更新操作符行为。
如果要更新的文档中不存在该字段,$push
会添加数组字段,并将该值作为其元素。
如果字段不是数组,操作会失败。
如果数值是一个数组,$push
会将整个数组作为一个元素追加。要单独添加数值的每个元素,可将 $each
修饰符与 $push
一起使用。有关示例,请参阅在多个文档中向数组追加值。有关 $push
可用修饰符的列表,请参阅修饰符。
从 MongoDB 5.0 开始,使用带空操作数表达式 ({ }
) 的更新操作符(如 $push
)时,mongod
不会再引发错误。空更新不会导致任何变化,也不会创建 oplog 条目(意味着该操作为“无操作”)。
Modifiers
您可以使用 $push
操作符与以下修饰符一起使用:
与修饰符一起使用时,$push
操作符采用以下格式:
{ $push: { <field1>: { <modifier1>: <value1>, ... }, ... } }
无论修饰符出现的顺序如何,使用修饰符对 $push
操作的处理均按以下顺序进行:
更新数组以在正确的位置添加元素。
如果已指定,则应用排序。
对数组进行切片(如果已指定)。
存储数组。
示例
创建 students
集合:
db.students.insertOne( { _id: 1, scores: [ 44, 78, 38, 80 ] } )
将值追加到数组
以下示例向 scores
数组追加 89
:
db.students.updateOne( { _id: 1 }, { $push: { scores: 89 } } )
示例输出:
{ _id: 1, scores: [ 44, 78, 38, 80, 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 ] } ] )
以下 $push
操作会向每个文档的 scores
数组追加 95
:
db.students.updateMany( { }, { $push: { scores: 95 } } )
要确认每个 scores
数组都包含 95
,请执行以下操作:
db.students.find()
操作返回以下结果:
[ { _id: 1, scores: [ 44, 78, 38, 80, 89, 95 ] }, { _id: 2, scores: [ 45, 78, 38, 80, 89, 95 ] }, { _id: 3, scores: [ 46, 78, 38, 80, 89, 95 ] }, { _id: 4, scores: [ 47, 78, 38, 80, 89, 95 ] } ]
向数组追加多个值
使用 $push
和 $each
修饰符将多个值附加到数组字段。
以下示例将 [ 90, 92, 85 ]
的每个元素附加到文档的 scores
数组,其中 name
字段等于 joe
:
db.students.updateOne( { name: "joe" }, { $push: { scores: { $each: [ 90, 92, 85 ] } } } )
$push
使用带有多个修饰符的 操作符
将以下文档添加到 students
集合中:
db.students.insertOne( { "_id" : 5, "quizzes" : [ { "wk": 1, "score" : 10 }, { "wk": 2, "score" : 8 }, { "wk": 3, "score" : 5 }, { "wk": 4, "score" : 6 } ] } )
以下 $push
操作使用:
$each
修饰符将多个文档添加到quizzes
数组,$sort
修改器,按score
字段降序对修改后quizzes
数组的所有元素进行排序,以及$slice
修饰符仅保留quizzes
数组的前三个排序元素。
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 } } } )
操作后,数组中只有三个得分最高的测验:
{ "_id" : 5, "quizzes" : [ { "wk" : 1, "score" : 10 }, { "wk" : 2, "score" : 8 }, { "wk" : 5, "score" : 8 } ] }