对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

$push(更新操作符)

$push

$push操作符将指定值追加到大量。

可以使用 $push 查找托管在以下环境中的部署:

  • MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务

$push操作符的形式为:

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

要在嵌入式文档或数组中指定 <field>,请使用点符号。

从 MongoDB 5.0 开始,更新操作符按字典顺序处理具有基于字符串的名称的文档字段。具有数字名称的字段按数字顺序处理。详情请参阅更新操作符行为。

如果要更新的文档中不存在该字段,$push 会添加具有该值的大量字段作为其元素。

如果字段不是数组,操作会失败。

如果值为大量,$push 会将整个大量作为单个元素追加。要单独添加值的每个元素,请将$each 修饰符与$push 一起使用。有关示例,请参阅向数组追加多个值。有关$push 可用修饰符的列表,请参阅修饰符。

从MongoDB5.0 开始,当您将 等更新操作符符与空操作数表达式()mongod $push一起使用时,{ } 不再引发错误。空更新不会导致任何更改,也不会创建oplog条目(意味着该操作为“不操作”)。

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

修饰符
说明

向数组字段追加多个值。

限制数组元素的数量。需要使用 $each 修改器。

对数组元素进行排序。需要使用 $each 修饰符。

指定大量中插入新元素的位置。需要使用$each 修饰符。如果没有$position 修饰符,$push 会将元素附加到大量的末尾。

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

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

$push无论修饰符出现的顺序如何,带有修饰符的 操作的处理都会按以下顺序进行:

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

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

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

  4. 存储数组。

本页上的示例使用sample_mflix示例数据集中的数据。有关如何将此数据集加载到自管理MongoDB 部署中的详细信息,请参阅加载示例数据集。如果对示例数据库进行了任何修改,则可能需要删除并重新创建数据库才能运行本页上的示例。

以下示例使用 $push 操作符将 "Classic" 追加到匹配的电影文档中的 genres 数组中:

db.movies.updateOne(
{ title: "The Dark Knight" },
{ $push: { genres: "Classic" } }
)

操作返回以下结果:

{
acknowledged: true,
insertedId: null,
matchedCount: 1,
modifiedCount: 1,
upsertedCount: 0
}

以下示例使用$push 操作符将"Acclaimed" genres附加到所有匹配电影文档中的 大量:

db.movies.updateMany(
{ "imdb.rating": { $gt: 9 } },
{ $push: { genres: "Acclaimed" } }
)

操作返回以下结果:

{
acknowledged: true,
insertedId: null,
matchedCount: '...',
modifiedCount: '...',
upsertedCount: 0
}

使用$push 和$each 修饰符将多个值附加到大量字段。

db.movies.updateOne(
{ title: "The Dark Knight" },
{ $push: { genres: { $each: [ "Modern Classic", "Award-Winning" ] } } }
)

操作返回以下结果:

{
acknowledged: true,
insertedId: null,
matchedCount: 1,
modifiedCount: 1,
upsertedCount: 0
}

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