MongoDB进阶与实战:微服务整合、性能优化、架构管理
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.5 更新文档

2.5.1 update命令

可以用update命令对指定的数据进行更新,命令的格式如下:

参数说明

● query:描述更新的查询条件;

● update:描述更新的动作及新的内容;

● options:描述更新的选项。

1.更新单个文档

如某个book文档被收藏了,则需要将该文档的favCount字段自增,代码如下:

2.更新多个文档

默认情况下,update命令只在更新第一个文档之后返回,如果需要更新多个文档,则可以使用multi选项。

如下面的操作中,将分类为“novel”的文档的发布时间(publishedDate)调整到当前时间,代码如下:

3.使用upsert命令

upsert是一种特殊的更新,其表现为如果目标文档不存在,则执行插入命令,代码如下:

该命令由于指定title的book文档不存在,因而会执行插入。从返回结果中可以看到,nMatched、nModified都为0,这表示没有文档被匹配及更新;nUpserted=1则提示执行了upsert动作,最终写入的文档由query和update限定符组成。

4.实现replace语义

update命令中的更新描述(update)通常由操作符描述,如果更新描述中不包含任何操作符,那么MongoDB会实现文档的replace语义,代码如下:

替换后的文档如下:

由于_id是不可变的,因此在更新描述中不用提供_id字段,如果提供了则必须保证和之前的文档一致,否则会提示错误。

update命令的选项配置较多,为了简化使用还可以使用一些快捷命令,具体如下:

● updateOne:更新单个文档。

● updateMany:更新多个文档。

● replaceOne:替换单个文档。

2.5.2 findAndModify命令

除了update命令,MongoDB还提供了一个特殊的命令:findAndModify。从命名上不难理解,findAndModify兼容了查询和修改指定文档的功能,下面介绍它的用法。

将某个book文档的收藏数(favCount)加1,代码如下:

该操作会返回符合查询条件的文档数据,并完成对文档的修改。

默认情况下,findAndModify会返回修改前的“旧”数据。如果希望返回修改后的数据,则可以指定new选项,代码如下:

findAndModify与update命令在使用方法上比较类似,共同点为:

● 单文档更新时可以保证原子性。

● 支持upsert模式。

然而,在结果行为方面,两者存在一些区别:

● findAndModify除了支持更新,还支持同时返回更新前或更新后的数据,而update只能返回WriteResult对象作为结果提示。

● findAndModify只能更新单个文档,而update在指定multi:true后可以更新多个文档。如果findAndModify匹配到了多个文档,则只会更新其第一个,可以通过设置sort条件来调整最终的结果。

与findAndModify语义相近的命令如下:

● findOneAndUpdate:更新单个文档并返回更新前(或更新后)的文档。

● findOneAndReplace:替换单个文档并返回替换前(或替换后)的文档。

2.5.3 更新操作符

更新操作符见表2-8。

表2-8 更新操作符

续表