个人公众号
整理mongodb文档(一):增
看前提示
本文主要用到的工具是mongodb的db管理工具-----mongo compass。
本文主要讲的是在上述工具中如何对db的增加的操作,对应转化为mongose里面的语句我想应该不需要我帮忙了吧。。。
选用mongose的理由也很简单,当我们一行一行敲代码的时候,很容易出错,但是当你用工具的时候,可以大大的将你的问题放在学习语法上,当然,我这里并不是单纯的使用ui的添加数据,而是敲命令行来加数据。
nodejs怎么连接mongodb的,我就不废话了
express的使用(五) 简单的使用mongodb
准备
开始前,我们先准备一个很干净的库,比如下面所示,我创建了一个名字叫做test的库,下面有一个名字叫做blog的集合,接下来的操作都在这儿做了。
正题
顾名思义,增就是往数据库指定集合里面增加数据,当然分为多种情况,一者是增加多个,一者是增加单条,就分别有了insertOne以及insertMany的两种api。
需要注意的是,如果你使用这类语法去添加数据的时候,如果你的collection的名字写错了。比如不小心从blog 写成了Blog,那么他会创建一个名字叫做Blog的collection,并且往里面加入数据,所以写代码的时候一定要定义好schema来操作我们的db。
insertOne
顾名思义,插入的是单条数据,具体的语法如下:
db.blog.insertOne({title:'关于mongodb的博客'})
创建结果如下:
没啥好说的,在insertOne语句中,我们插入了一个自己定义的对象,而在这个对象中,我们定义了一个字段,然后执行了这个语句后,在db中给我们插入了一个数据,并且给我们的数据自动添加了一个_id。而且返回了我们插入的结果
insertMany
顾名思义,插入的是多条数据,具体语法如下:
db.blog.insertMany([
{title:'关于express的博客'},
{title:'关于react的博客'},
{title:'关于vue的博客'}
])
同样,插入一个数组数据之后,我们的db直接返回了一个插入的结果,并且生成的数据都有一个_id.
insert
假设存在以下操蛋的行为,一个由前端传过来的数据,不确定是一个json或者是一个array,则此时我们又觉得判断是否为数组,然后分别调用insertOne以及insertMany太蠢了。我们就可以调用insert方法。由于方法不常用到,我就只是贴一下代码,不贴运行结果了。
#插入单条数据
db.blog.insert({title:'关于mongodb的博客'})
#插入多条数据
db.blog.insert([
{title:'关于express的博客'},
{title:'关于react的博客'},
{title:'关于vue的博客'}
])
writeConcern
处理完了正餐,我们就要处理下其他的参数了。比如提及到的writeConcern
简单来说。writeConcern决定一个写操作落在多少个节点上才算成功。怎么理解?比如一个线上服务,不可能说我们只有一台数据库的。因为数据出问题怎么办?那就有了集群的概念。不过对于新手,下面的知识只是给你做个扩展而已。我想新手也接触不到这一块的知识。
到了现在,大家算是掌握了mongodb的insert的方法,但也仅仅限制于添加了一条数据,比如对于object_id,以及如何添加一个createdtime之类的细节操作,我们还没有好好的探究。但是上述问题如果也探究起来,太长了。因为正题是writeConcern,先让我们拿insertOne第二个参数来开刀吧。个insertOne做例子,现在修改下我们的sql语句:
db.blog.insertOne(
{title:'关于mongodb的博客'},
{writeConcern: { w :'majority' }}
)
可以看到,返回的结果基本没什么变化
翻看了下,关于’majority’这一块的描述
上述文字,大家基本都看到了’transaction‘这个字眼,对于老手,自然知道是关系到事务以及关系到了错误回滚的这一块,所以后面在事务的篇章,我会大概描述下,但是新手理解这儿的意思是关系到数据的一致性,比如看下下面的解释,或许你会明白我在说什么(直接解释集群概念对部分新手不友好,因为大家都数据库的理解可能只是存储数据,并没有考虑到数据丢失之类的。)
顺带提一嘴,很多人看到这个majority,会觉得别人为什么都是用0,1,2这些数字,而不是用这个,那是因为
w: “majority” in MongoDB 5.0 and later, with differences for
deployments containing arbiters. See Implicit Default Write Concern.
w: 1 in MongoDB 4.4 and earlier.
后面的1,2,3代表的是节点数目。比如一个集群四个机子,我们将所有的数据都拷贝到4台机子,就是
{w:4}
很明显,我本地没有那么多机器,而且普通的数据不需要这么夸张,如果是用户的数据或则是交易数据等重要的数据,我们可以使用majority,代表的是拷贝到大多数的节点里面,也就是一份数据,大部分的节点都觉得存进去了,那么才可以返回ok。至于性能问题,后面涉及到的时候再跟大家说吧。
ordered
既然谈论完了insertOne的writeConcern,接下来就从多条数据的插入错误问题来理解下ordered。先举个例子来看下:
db.blog.insertMany(
[{title:'关于express的博客',_id:'1'},
{title:'关于react的博客',_id:'1'},
{title:'关于vue的博客'}
])
其中,两条数据的_id是一样的,这样插入数据的时候必定有问题,那么我们先这样子插入试试
果然,报错了,但是第一条数据也被插进去了,但第二条数据因为错误,中断了我们的插入操作,导致无辜的第三条数据并没有被插入进去,那么我们应该怎么让第三条数据不出现问题呢?而ordered就排上用场了,继续更改下sql
db.blog.insertMany(
[{title:'关于express的博客',_id:'1'},
{title:'关于react的博客',_id:'1'},
{title:'关于vue的博客'}
],
{ordered:false})
上面的sql的改动,就在于我们添加了一个ordered为false的设置项,这样子,除了第二条的重复_id数据,我们的别的数据并没有被影响到,从而实现了无序插入,即别的数据操作的时候不会影响我们没问题的数据。
当然了,默认的ordered是true,也就是其中一条出了问题,会中断插入,导致影响到剩余的数据。
对于insert方法。其中也提供了ordered以及writeConcern的参数,但是新手不怎么建议理解这个,你最需要完成的任务是crud,这样子你后面回过头来再看,你的理解会更加深。
最后的废话
所有的文档都是来源于mongodb的官方文档,对于其他的基本操作,后续会慢慢补充。