Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Docs 菜单
Docs 主页
/ /

$ 设立 (更新操作符)

注意

消歧

以下页面是指更新操作符 $set。有关聚合阶段,请参阅 $set

$set

$set 操作符会用指定值替换某个字段的值。

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

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

$set 操作符表达式的形式如下:

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

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

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

如果该字段不存在,并且新字段不违反类型限制,则$set 会添加具有指定值的新字段。如果为不存在的字段指定虚线路径,$set 将根据需要创建嵌入式文档,以满足该字段的虚线路径。

如果指定多个字段值对,$set 则会更新或创建每个字段。

从 MongoDB 5.0 开始,使用带空操作数表达式 ({ }) 的更新操作符(如 $set)时,mongod 不会再引发错误。空更新不会导致任何变化,也不会创建 oplog 条目(意味着该操作为“无操作”)。

与完整文档替换相比,$set操作符具有以下优点:

  • 有针对性的更新:$set 仅修改指定字段,在处理大型文档时避免不必要的写入和开销,从而确保高效更新。

  • 高效的 Oplog 条目$set 通过仅将更新的字段写入oplog而不是整个文档来优化复制。此进程减小了oplog条目的大小,并允许节点更有效地复制更改。

  • 简化的逻辑:使用 $set 的应用程序在发送更新之前无需计算已更改的字段。MongoDB通过在内部处理增量计算来降低复杂性。

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

以下示例使用$set 操作符将labelstatus 字段添加到匹配的电影文档中:

db.movies.updateOne(
{ title: "The Dark Knight" },
{
$set: {
label: "Award Winner",
status: "classic"
}
}
)

操作返回以下结果:

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

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

以下示例使用点表示法更新匹配电影中 imdb嵌入式文档的 highlight字段:

db.movies.updateOne(
{ title: "The Dark Knight" },
{ $set: { "imdb.highlight": "Critics' Choice" } }
)

操作返回以下结果:

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

重要

前面的示例使用点表示法更新嵌入式highlight imdb文档的 字段。以下格式会替换整个嵌入式文档,并从 imdb中删除所有其他字段:

db.movies.updateOne(
{ title: "The Dark Knight" },
{ $set: { imdb: { highlight: "Critics' Choice" } } }
)

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

以下示例使用$set 0genres操作符更新匹配电影文档中 大量的第一个元素(大量索引 ):

db.movies.updateOne(
{ title: "The Dark Knight" },
{ $set: { "genres.0": "Thriller" } }
)

操作返回以下结果:

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

有关数组的其他运算符,请参阅数组更新运算符

提示

后退

$rename

在此页面上