个人博客
整理mongodb文档:改
求关注,求批评,求进步
文章概叙
本文主要讲的是mongodb的updateOne以及updateMany,主要还是在shell下进行操作,也讲解下主要的参数upsert以及更新的参数。
数据准备
本次需要准备的数据不是很多,就两条就可以了
db.test.insertMany([
{ string: 'a', number: 1 },
{ string: 'A', number: 1 }
])
updateOne
Updates a single document within the collection based on the filter.
顾名思义,在过滤筛选的结果上更新单个文档,示例代码如下
db.test.updateOne(
{ string: 'a' },
{ $set: { string: 'a1', number: 1 } },
{ upsert: true }
)
这儿传入了三个参数,第一个是我们的filter,也就是过滤条件,而我们操作的数据就是根据这个过滤条件查询出来的,如果返回的数据有多条,则只操作第一条。
第二个参数是更新操作,$set代表的是设置值,属于更新运算符的范畴,具体可以看下面链接,理解更多的操作符。
Update Operators — MongoDB Manual
第三个参数是配置项,最经常用到的是upsert以及collation,文章下面也会讲到,这儿只是大概讲解该api的结构。
最终,更改后的结果如下,可以看到已经将原来的a更改为了a1.
updateMany
Updates all documents that match the specified filter for a collection.
顾名思义,在过滤筛选的结果上更新所有的文档,老规矩,先来一个例子作为讲解。
db.test.updateMany(
{ number: 1 },
{ $set: { string: 'a1', number: 1 } },
{ upsert: true }
)
对于该API的参数,也跟上面的updateOne差不多,只是更新的是查询出来的全部数据。
update
需要注意的是,该api在5.0之后就不建议使用了,就废弃了。
默认情况下,update用于更新单个文档,如果需要更新多个文档,需要用到multi选项。
下面是一个简单的实例,只是让大家看下这个语法怎么用而已,毕竟已经是一个废弃的API了。
db.test.update(
{ number: 1 },
{ $set: { string: 'a1', number: 1 } },
{ upsert: true ,multi:true}
)
介绍完了三个最主要的API的用法,接下来用updateMany作为例子,讲下几个主要的参数。
update
update是指我们要更新的操作,最简单的例子就是使用$set。update的操作有两种类型,下面先介绍如何使用更新运算符操作。
更新运算符有三种类型,最常用的是数组以及字段的更新运算符,下面会拿字段的更新运算符做个例子,先抄录表格如下:
$set之前已经试过了,现在试试$currentDate来给一个字段赋值当前的时间。
db.test.updateMany(
{ number: 1 },
{ $currentDate: { lastModified: true } },
{ upsert: true, multi: true }
)
其他的用法再看文档的实例,用起来不会有什么难度。
upsert
Creates a new document if no documents match the . For more details see filterupsert behavior.
文档中对于upsert的解释是:如果没有找到文档时候是否创建。下面用一个简单的例子来说明
db.test.updateMany(
{ number: 2 },
{ $currentDate: { lastModified: true } },
{ upsert: true, multi: true }
)
可以看到, 当我们运行语句的时候,upsert为true,则表示没有找到number为2的数据的情况下,mongodb帮我们创建了一条数据。相同,如果upsert为false,则不会创建。
collation
之前有专门的博客讲解过这个参数,就不专门再说了,collation影响的是查数据出来的顺序
整理mongodb文档:collation
聚合管道
聚合管道可以理解为一堆数据,先通过a操作,然后再通过b操作,最后将数据整合成为自己想要的模型,在更新操作中,聚合管道有下面几个阶段。
$addFields
$set
$project
$unset
$replaceRoot
$replaceWith
这儿我会通过一个简单的例子让大家了解下如何使用聚合管道,而关于具体的聚合管道,后续会写个博客介绍,本文章最主要是让大家对这几个api有了解,不会很一脸茫然。
举个例子,下面的代码会将我们之前的number等于2的数据删除掉lastModified字段,增加string字段
db.test.updateMany(
{ number: 2 },
[
{ "$project": { "lastModified": 0 } },
{ "$set": { string: 'a2' } }
],
{ upsert: true }
)
最后的点
至此,关于update的几个主要的点,讲解完毕,对于新手我不建议现在去看聚合管道,所以没马上讲,我的建议是先看完增删改查。
最后,你觉得上单锐雯怎么玩呢?来个大佬。。。。