Docs 菜单
Docs 主页
/
MongoDB Manual
/ / / /

$push

在此页面上

  • 定义
  • 兼容性
  • 语法
  • 行为
  • Modifiers
  • 示例
$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 条目(意味着该操作为“无操作”)。

您可以使用 $push 操作符与以下修饰符一起使用:

修饰符
说明
向数组字段追加多个值。
限制数组元素的数量。需要使用 $each 修改器。
对数组元素进行排序。需要使用 $each 修饰符。
指定数组中插入新元素的位置。需要使用 $each 修饰符。如果没有 $position 修饰符,$push 会将元素追加到数组的末尾。

与修饰符一起使用时,$push 操作符采用以下格式:

{ $push: { <field1>: { <modifier1>: <value1>, ... }, ... } }

无论修饰符出现的顺序如何,使用修饰符对 $push 操作的处理均按以下顺序进行:

  1. 更新数组以在正确的位置添加元素。

  2. 如果已指定,则应用排序。

  3. 对数组进行切片(如果已指定)。

  4. 存储数组。

创建 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 ] } } }
)

将以下文档添加到 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 }
]
}

提示

另请参阅:

后退

$pull