参考 > 参考 > mongo Shell方法 > 收集方法 > db.collection.update()
db.collection.
update
(查询,更新,选项)¶mongo
壳法
此页面记录了mongo
shell方法,并且
没有引用MongoDB Node.js驱动程序(或任何其他驱动程序)方法。对于相应的MongoDB驱动程序API,请改为参考您特定的
MongoDB驱动程序文档。
修改现有文档或集合中的文档。根据更新参数,该方法可以修改一个或多个现有文档的特定字段或完全替换现有文档 。
默认情况下,该db.collection.update()
方法更新
单个文档。包括选项multi:true
以更新所有符合查询条件的文档。
该db.collection.update()
方法具有以下形式:
该db.collection.update()
方法采用以下参数:
参数 | 类型 | 描述 | ||||||
---|---|---|---|---|---|---|---|---|
询问 | 文献 |
当执行 |
||||||
更新 | 文件或管道 | 要应用的修改。可以是以下之一:
有关详细信息和示例,请参见示例。 |
||||||
上升 | 布尔值 | 可选的。如果设置为 |
||||||
多 | 布尔值 | 可选的。如果设置为 |
||||||
writeConcern | 文献 | 可选的。表达书面关切的文件。忽略使用默认的写关注。 如果在事务中运行,则不要为操作明确设置写关注点。要对事务使用写关注,请参见 事务和写关注。 有关使用的示例 |
||||||
校对 | 文献 | 可选的。 归类允许用户为字符串比较指定特定于语言的规则,例如字母大写和重音符号的规则。 有关使用的示例 3.4版的新功能。 |
||||||
arrayFilters | 数组 | 可选的。筛选器文档数组,用于确定要对数组字段进行更新操作要修改的数组元素。 在更新文档中,使用
注意 如果该标识符未包含在更新文档中,则不能具有标识符的数组过滤器文档。 有关示例,请参阅为数组更新操作指定arrayFilters。 3.6版的新功能。 |
||||||
暗示 | 文件或字串 |
该选项可以采用索引规范文档或索引名称字符串。 如果指定的索引不存在,则操作错误。 有关示例,请参阅为更新操作指定提示。 4.2版中的新功能。 |
该方法返回包含操作状态的WriteResult文档。
要使用db.collection.update()
具有上分片收集,您必须在精确匹配
字段或针对单一碎片(如包括片键)。multi: false
_id
当db.collection.update()
执行更新操作(而不是文档替换操作)时,
db.collection.update()
可以针对多个分片。
也可以看看
从MongoDB 4.2开始,替换文档操作首先尝试使用查询过滤器来定位单个分片。如果该操作无法通过查询过滤器定位到单个分片,则它将尝试以替换文档定位。
在早期版本中,该操作尝试使用替换文档作为目标。
upsert
在分片集合上¶对于db.collection.update()
包含
upsert:true且位于分片集合上的操作,您必须在中包含完整的分片键filter
:
从MongoDB 4.2开始,除非分片键字段是不可变_id
字段,否则您可以更新文档的分片键值。有关更新分片键的详细信息,请参阅“ 更改文档的分片键值”。
在MongoDB 4.2之前,文档的分片键字段值是不可变的。
要用于db.collection.update()
更新分片键:
multi: false
db.collection.update()
可以在多文档交易中使用。
重要
在大多数情况下,与单文档写入相比,多文档事务产生的性能成本更高,并且多文档事务的可用性不应代替有效的架构设计。在许多情况下, 非规范化数据模型(嵌入式文档和数组)对于您的数据和用例将继续是最佳的。也就是说,在许多情况下,对数据进行适当的建模将最大程度地减少对多文档交易的需求。
有关其他事务使用方面的注意事项(例如运行时限制和oplog大小限制),另请参见 生产注意事项。
在事务内部,您可以指定对现有集合的读/写操作。如果db.collection.update()
导致upsert,则该集合必须已经存在。
如果该操作导致upsert,则该集合必须已经存在。
在mongo
外壳中,创建一个books
包含以下文档的集合。此命令首先从books
集合中删除所有先前存在的文档:
如果<update>
文档包含更新运算符修饰符,例如使用
$set
修饰符的修饰符,则:
<update>
文档必须仅
包含更新运算符表达式。db.collection.update()
方法仅更新文档中的相应字段。您可以使用下面的Web Shell插入示例文档并执行示例更新操作:
在此操作中:
<query>
参数哪个文档更新指定,{ _id: 1 }
$inc
操作递增stock
领域,$set
操作者更换的价值item
领域,publisher
info
嵌入文档中的字段,tags
字段和ratings
数组中的第二个元素。更新后的文档如下:
此操作对应于以下SQL语句:
注意
如果query
参数已匹配多个文档,则此操作将仅更新一个匹配的文档。要更新多个文档,必须将multi
选项设置为true
。
在mongo
外壳中,创建一个books
包含以下文档的集合。此命令首先从books
集合中删除所有先前存在的文档:
以下操作使用$push
update运算符将新对象附加到ratings
数组。
您可以使用下面的Web Shell插入示例文档并执行示例更新操作:
更新后的文档如下:
也可以看看
在mongo
外壳中,创建一个books
包含以下文档的集合。此命令首先从books
集合中删除所有先前存在的文档:
以下操作使用$unset
运算符通过删除tags
文档中的字段。{ _id: 1 }
您可以使用下面的Web Shell插入示例文档并执行示例更新操作:
更新后的文档如下:
没有等效于的直接SQL $unset
,但是$unset
类似于以下SQL命令,该命令tags
从books
表中删除了该字段:
在mongo
外壳中,创建一个books
包含以下文档的集合。此命令首先从books
集合中删除所有先前存在的文档:
如果<update>
文档仅 包含field:value
表达式,则:
db.collection.update()
方法将匹配的文档替换为<update>
文档。该
db.collection.update()
方法不会替换该
_id
值。db.collection.update()
无法更新多个文档。以下操作将传递<update>
仅包含字段和值对的文档。该<update>
文档将完全替换原始文档(_id
字段除外)。
您可以使用下面的网络外壳插入