参考 > 参考 > mongo Shell方法 > 收集方法 > db.collection.updateOne()
db.collection.
updateOne
(filter,update,options )¶mongo
壳法
此页面记录了mongo
shell方法,并且
没有引用MongoDB Node.js驱动程序(或任何其他驱动程序)方法。对于相应的MongoDB驱动程序API,请改为参考您特定的
MongoDB驱动程序文档。
3.2版中的新功能。
根据过滤器更新集合中的单个文档。
该updateOne()
方法具有以下语法:
该db.collection.updateOne()
方法采用以下参数:
参数 | 类型 | 描述 | ||||
---|---|---|---|---|---|---|
过滤 | 文献 |
指定一个空文档以更新集合中返回的第一个文档。 |
||||
更新 | 文件或管道 | 要应用的修改。可以是以下之一:
要使用替换文档进行更新,请参阅
|
||||
upsert |
布尔值 | 可选的。当
为避免多次更新,请确保 默认为 |
||||
writeConcern |
文献 | 可选的。表达书面关切的文件。省略使用默认的写关注。 如果在事务中运行,则不要为操作明确设置写关注点。要对事务使用写关注,请参见 事务和写关注。 |
||||
collation |
文献 | 可选的。 指定 用于操作的排序规则。 归类允许用户为字符串比较指定特定于语言的规则,例如字母大写和重音符号的规则。 排序规则选项具有以下语法: 指定排序规则时,该 如果未指定排序规则,但是集合具有默认排序规则(请参阅参考资料 如果没有为集合或操作指定排序规则,则MongoDB使用先前版本中使用的简单二进制比较进行字符串比较。 您不能为一个操作指定多个排序规则。例如,您不能为每个字段指定不同的排序规则,或者如果对排序执行查找,则不能对查找使用一种排序规则,而对排序使用另一种排序规则。 3.4版的新功能。 |
||||
arrayFilters |
数组 | 可选的。筛选器文档数组,用于确定要对数组字段进行更新操作要修改的数组元素。 在更新文档中,使用 注意 在 您可以在更新文档中多次包含相同的标识符;但是,对于 但是,您可以在单个过滤器文档中的相同标识符上指定复合条件,例如以下示例: 有关示例,请参阅为数组更新操作指定arrayFilters。 3.6版的新功能。 |
||||
暗示 | 文件或字串 |
该选项可以采用索引规范文档或索引名称字符串。 如果指定的索引不存在,则操作错误。 有关示例,请参阅为更新操作指定提示。 4.2.1版中的新功能。 |
db.collection.updateOne()
查找与过滤器匹配的第一个文档,并应用指定的
更新修改。
从MongoDB 4.2开始,该db.collection.updateOne()
方法可以接受指定要执行的修改的聚合管道 。管道可以包括以下阶段:[ <stage1>, <stage2>, ... ]
$addFields
及其别名 $set
$project
及其别名 $unset
$replaceRoot
及其别名$replaceWith
。使用聚合管道可以实现更具表达力的更新语句,例如根据当前字段值表达条件更新,或使用另一个字段的值更新一个字段。
例如:
有关示例,请参见使用聚合管道更新。
如果和没有文档匹配,则
根据条件和修改创建一个新文档。请参阅
使用Upsert更新。upsert: true
filter
db.collection.updateOne()
filter
update
如果在分片集合上指定,则必须在filter中包括完整的分片键。有关分片集合的其他行为,请参见分片集合。upsert: true
db.collection.updateOne()
如果更新操作更改了文档大小,则该操作将失败。
要db.collection.updateOne()
在分片集合上使用:
从MongoDB 4.2开始,除非分片键字段是不可变_id
字段,否则您可以更新文档的分片键值。有关更新分片键的详细信息,请参阅“ 更改文档的分片键值”。
在MongoDB 4.2之前,文档的分片键字段值是不可变的。
要用于db.collection.updateOne()
更新分片键:
db.collection.updateOne()
可以在多文档交易中使用。
重要
在大多数情况下,与单文档写入相比,多文档事务产生的性能成本更高,并且多文档事务的可用性不应代替有效的架构设计。在许多情况下, 非规范化数据模型(嵌入式文档和数组)对于您的数据和用例将继续是最佳的。也就是说,在许多情况下,对数据进行适当的建模将最大程度地减少对多文档交易的需求。
有关其他事务使用方面的注意事项(例如运行时限制和oplog大小限制),另请参见 生产注意事项。
在事务内部,您可以指定对现有集合的读/写操作。如果db.collection.updateOne()
导致upsert,则该集合必须已经存在。
该restaurant
集合包含以下文档:
以下操作将使用字段更新单个文档
:name: "Central Perk Cafe"
violations
该操作返回:
如果未找到匹配项,则该操作返回:
如果找不到匹配项,则设置将插入文档。请参阅
使用Upsert更新upsert: true
从MongoDB 4.2开始,db.collection.updateOne()
可以使用聚合管道进行更新。管道可以包括以下阶段:
$addFields
及其别名 $set
$project
及其别名 $unset
$replaceRoot
及其别名$replaceWith
。使用聚合管道可以实现更具表达力的更新语句,例如根据当前字段值表达条件更新,或使用另一个字段的值更新一个字段。
以下示例使用聚合管道使用文档中其他字段的值来修改字段。
members
使用以下文档创建一个集合:
假设,而不是独立的misc1
,并misc2
在第一文档中的字段,要收集这些成comments
场,就像第二个文档。以下更新操作使用聚合管道执行以下操作:
comments
字段并设置该lastUpdate
字段。misc1
和misc2
字段。命令后,集合包含以下文档:
聚合管道允许更新基于当前字段值执行条件更新,并使用当前字段值来计算单独的字段值。
例如,students3
使用以下文档创建一个集合:
第三个文档缺少和
字段。使用聚合管道,可以使用计算出的平均成绩和字母成绩更新文档。_id: 3
average
grade