目录
- 一、更新文档命令的格式
- 二、更新操作符
- 三、更新单个文档
- 3.1、更新单个文档的示例
- 四、更新多个文档
- 4.1、更新多个文档的概述
- 4.2、更新多个文档的示例
- 五、使用upsert命令
- 5.1、upsert命令的概述
- 5.2、upsert命令的示例
- 六、实现replace语义
- 6.1、update实现replace语义的概述
- 6.2、update实现replace语义的示例
- 七、findAndModify命令
- 7.1、findAndModify命令概述
- 7.2、findAndModify命令示例1
- 7.3、findAndModify命令示例2
一、更新文档命令的格式
- 可以用update命令对指定的数据进行更新,命令的格式如下:
db.collection.update(query,update,options)
参数 | 作用 |
query | 描述更新的查询条件 |
options | 描述更新的选项 |
upsert | 可选,如果不存在update的记录,是否插入新的记录。默认false,不插入 |
multi | 可选,是否按条件查询出的多条记录全部更新。 默认false,只更新找到的第一条记录 |
writeConcern | 可选,决定一个写操作落到多少个节点上才算成功。 |
二、更新操作符
操作符 | 格式 | 描述 |
$set | {$set:{field:value}} | 指定一个键并更新值,若键不存在则创建 |
$unset | {$unset : {field : 1 }} | 删除一个键 |
$inc | {$inc : {field : value } } | 对数值类型进行增减 |
$rename | {$rename : {old_field_name :new_field_name } } | 修改字段名称 |
$push | { $push : {field : value } } | 将数值追加到数组中,若数组不存在则会进行初始化 |
$pushAll | {$pushAll : {field : value_array }} | 追加多个值到一个数组字段内 |
$pull | {$pull : {field : _value } } | 从数组中删除指定的元素 |
$addToSet | {$addToSet : {field : value } } | 添加元素到数组中,具有排重功能 |
$pop | {$pop : {field : 1 }} | 删除数组的第一个或最后一个元素 |
三、更新单个文档
3.1、更新单个文档的示例
示例需求:将books文档中的favCount字段自增的
- 先查询所有文档
> db.books.find()
- 根据id更新books文档中的favCount字段自增
> db.books.update({_id:ObjectId("62558ad4fc0392835a753c6b")},{$inc:{favCount:1}})
- 根据id查询books文档中的favCount字段,数量已自增1
#根据id查询books文档中的favCount字段,数量已自增1
> db.books.find({_id:ObjectId("62558ad4fc0392835a753c6b")})
四、更新多个文档
4.1、更新多个文档的概述
- 默认情况下,update命令只在更新第一个文档之后返回,如果需要更新多个文档,则可以使用multi选项。
- update命令的选项配置较多,为了简化使用还可以使用一些快捷命令:
(1)、updateOne:更新单个文档。
(2)、updateMany:更新多个文档。
(3)、replaceOne:替换单个文档
4.2、更新多个文档的示例
示例需求:将books文档中分类为“novel”的文档的增加发布时间(publishedDate)
- 先查询books文档中分类为“novel”的文档
> db.books.find({type:"novel"})
- 将分类为“novel”的文档的增加发布时间(publishedDate)
db.books.update({type:"novel"},{$set:{publishedDate:new Date()}},{"multi":true})
- 再次查询books文档中分类为“novel”的文档
五、使用upsert命令
5.1、upsert命令的概述
- upsert是一种特殊的更新,其表现为如果目标文档不存在,则执行插入命令。
5.2、upsert命令的示例
- 更新title为my book的文档
> db.books.update( {title:"my book"}, {$set:{tags:["nosql","mongodb"],type:"none",author:"fox"}}, {upsert:true} )
- 输出结果中nMatched、nModified都为0,表示没有文档被匹配及更新;nUpserted=1提示执行了upsert动作
六、实现replace语义
6.1、update实现replace语义的概述
- update命令中的更新描述(update)通常由操作符描述,如果更新描述中不包含任何操作符,那么MongoDB会实现文档的replace语义。
6.2、update实现replace语义的示例
- 先查询books文档中title为my book的文档
> db.books.find({title:"my book"})
- update命令中不包含任何操作符
> db.books.update( {title:"my book"}, {justTitle:"my first book"} )
- 再次查询books文档中title为my book的文档查询不到文档,只能查询到justTitle为my first book的文档
db.books.find({justTitle:"my first book"})
七、findAndModify命令
7.1、findAndModify命令概述
- findAndModify兼容了查询和修改指定文档的功能,findAndModify只能更新单个文档。
- 该操作会返回符合查询条件的文档数据,并完成对文档的修改。
- 默认情况下,findAndModify会返回修改前的“旧”数据。如果希望返回修改后的数据,则可以指定new选项
7.2、findAndModify命令示例1
示例需求:将books文档中的某个book文档的收藏数(favCount)加1
- 先查询所有文档,获取第一条文档的id
> db.books.find()
- 根据获取到的第一条文档的id执行findAndModify命令
db.books.findAndModify({ query:{_id:ObjectId("62558ad4fc0392835a753c6b")}, update:{$inc:{favCount:1}} })
- 由下图输出结果可知,默认情况下,findAndModify会返回修改前的“旧”数据。
7.3、findAndModify命令示例2
- 先查询所有文档,获取第一条文档的id
> db.books.find()
- 根据获取到的第一条文档的id执行findAndModify命令,并指定new选项
db.books.findAndModify({ query:{_id:ObjectId("62558ad4fc0392835a753c6b")}, update:{$inc:{favCount:1}}, new: true })
- 如下图输出结果可知,指定new选项,findAndModify会返回修改后的“新”数据。