$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版本开始,当使用mongod
程序,并使用空操作数表达式({ }
)更新操作符,如$push
时,不再引发错误。空更新不会产生任何更改,也不会创建操作日志条目(表示操作为空操作)。
修饰符
您可以使用以下修饰符与$push
操作符一起使用
与修饰符一起使用时,$push
操作符的形式为
{ $push: { <field1>: { <modifier1>: <value1>, ... }, ... } }
修饰符的顺序与修饰符出现顺序无关,以下顺序处理$push
操作
更新数组以添加正确位置的元素。
如果指定,应用排序。
如果指定,截断数组。
存储数组。
示例
创建students
集合
db.students.insertOne( { _id: 1, scores: [ 44, 78, 38, 80 ] } )
向数组添加一个值
以下示例将 89
添加到 scores
数组中
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
操作将 95
添加到每个文档中的 scores
数组中
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 ]
的每个元素添加到名为 joe
的文档的 scores
数组中。
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 } ] }