一、Mongo基本命令-1
- 打开命令行:先打开运行(快捷键win+R),然后输入cmd后回车,就可以打开命令行工具。
- 执行mongod:在命令中直接输入mongod,但是你会发现服务并没有启动,报了一个exception,服务停止了。
- 新建文件夹:出现上边的错误,是因为我们没有简历Mongodb需要的文件夹,一般是安装盘的根目录,建立data/db,这两个文件夹。
- 运行mongod:这时候服务就可以开启了,链接默认端口是27017。
链接服务: - 服务端开启后,我们可以使用命令行来链接服务端,链接命令是mongo。重新打开一个命令行工具,然后输入mongo命令。也许你在链接时会报几个warning(警告),我们先不用管它,以后我们再慢慢学习。
查看存在数据库命令:show dbs
查看数据库版本命令:db.version() - mongo shell 如果以前接触过数据库一定知道每个数据库都有自己独特的命令,MSSQL和MYsql用的都是Sql命令,MongoDB的操作命令就是前端最熟悉的JavaScript命令。看到这里作为前端你一定会小激动一下,这对前端来说那是极好的。
先来一个常用的赋值和输出命令,熟悉一下。(操作前你需要打开Mongo服务器和链接到服务器-也就是我们上节课讲的mongod命令和mongo命令)在命令行中输入以下代码。var x='Hello World' print(x)
- 数据操作基础命令
- use db(建立数据库):use不仅可以进入一个数据库,如果你敲入的库不存在,它还可以帮你建立一个库。但是在没有集合前,它还是默认为空。
- db.集合.insert( ):新建数据集合和插入文件(数据),当集合没有时,这时候就可以新建一个集合,并向里边插入数据。Demo:db.user.insert({“name”:”jspang”})
- db.集合.find( ):查询所有数据,这条命令会列出集合下的所有数据,可以看到MongoDB是自动给我们加入了索引值的。Demo:db.user.find()
- db.集合.findOne( ):查询第一个文件数据,这里需要注意的,所有MongoDB的组合单词都使用首字母小写的驼峰式写法。
- db.集合.update({查询},{修改}):修改文件数据,第一个是查询条件,第二个是要修改成的值。这里注意的是可以多加文件数据项的,比如下面的例子。
db.jspang.update({"name":"jspang"},{"name":"jspang","age":"32"})
- db.集合.remove(条件):删除文件数据,注意的是要跟一个条件。Demo:db.user.remove({“name”:”jspang”})
- db.集合.drop( ):删除整个集合,这个在实际工作中一定要谨慎使用,如果是程序,一定要二次确认。
- db.dropDatabase( ):删除整个数据库,在删除库时,一定要先进入数据库,然后再删除。实际工作中这个基本不用,实际工作可定需要保留数据和痕迹的。
二、用js文件写mongo命令
- 把命令写入JS中: 现在模拟一个用户登录日志表的信息,用JS进行编写。新在一个新建的目录下,比如D:/mongoShell/,新建一个goTask.js文件。文件内容如下:
ar userName="jspang"; //声明一个登录名 var timeStamp=Date.parse(new Date()); //声明登录时的时间戳 var jsonDdatabase={"loginUnser":userName,"loginTime":timeStamp}; //组成JSON字符串 var db = connect('log'); //链接数据库 db.login.insert(jsonDdatabase); //插入数据 print('[demo]log print success'); //没有错误显示成功
- 执行JS文件
- 写好了JS文件,需要执行起来,看一下文件是否存在问题,能否顺利的插入数据到MongoDB中。
执行其实很简单,只要使用mongo xxx.js(xxx就是我们写的goTask.js文件)mongo goTask.js
- 然后我们可以在命令行看到已经执行成功,可以到终端中进行查看插入结果。
总结:这节课很好的解决了在终端中写命令行的难题,虽然大部分Shell和在命令行中写法一样,但是也稍有不同,希望小伙伴们可以轻松掌握。
三、批量插入的正确方法
- 在操作数据库时要注意两个能力:
第一个是快速存储能力。
第二个是方便迅速查询能力。 - 批量数据插入是以数组的方式进行的(如果写错,可以3个回车可以切出来)。我们现在命令行中敲入下面的代码,我们可以看到数据顺利插入了。
db.test.insert([ {"_id":1}, {"_id":2}, {"_id":3} ])
- 老版本MongoDB(3.2以前的版本基本都需要)是需要在Insert前加一个batch单词的,如下代码。
db.test.batchInsert([ {"_id":1}, {"_id":2}, {"_id":3} ])
- 注意一次插入不要超过48M,向.zip和大图片什么的尽量用静态存储,MongoDB存储静态路径就好,这也算是一个规则。
- 刚学了批量插入,那是循环插入快?还是批量插入快那?在一般人的认知里肯定是批量插入更快(其实这毋庸置疑),但我们要拿出极客精神,探个究竟,试着写一个小Shell,来验证一下结果。
- 先写一个循环插入方法:
var startTime = (new Date()).getTime(); //得到开始时间 var db = connect('log'); //链接数据库 //开始循环 for(let i=0;i<1000;i++){ db.test.insert({num:i}); } var runTime = (new Date()).getTime()-startTime;//计算时间差 print ('This run this is:'+runTime+'ms');//打印出来
- 批量插入代码:
var startTime = (new Date()).getTime(); var db = connect('log'); var tempArray = [] //声明一个数组 for(let i=0;i<1000;i++){ //循环向数组中放入值 tempArray.push({num:i}); } db.test.insert(tempArray) //批量一次插入 var runTime = (new Date()).getTime()-startTime; print ('This run this is:'+runTime+'ms');
- 总结:在工作中一定要照顾数据库性能,这也是你水平的提现,一个技术会了很简单,但是要作精通不那么简单。学完这节,记得在工作中如果在循环插入和批量插入举起不定,那就选批量插入吧,它会给我们更优的性能体验。
四、修改:Update常见错误
- 这节课开始我们要说一说Update的详细操作,我们先来看一下常见错误,我们知道了困难或者说问题在哪里,我们再提出解决方案。这节课我会先演示一些错误的Update方法,然后再说正确的方法。
- 错误1:只update修改项
- 如果你有过关系型数据库的经验,你会很容易犯只修改需要改变的一项,因为在关系型数据库中就是这样作的。先来准备一些数据,这些数据模拟了一个软件开发小组的组成(当然这不能当真)。
var workmate1={ name:'JSPang', age:33, sex:1, job:'前端', skill:{ skillOne:'HTML+CSS', SkillTwo:'JavaScript', SkillThree:'PHP' }, regeditTime:new Date() } var workmate2={ name:'ShengLei', age:30, sex:1, job:'JAVA后端', skill:{ skillOne:'HTML+CSS', SkillTwo:'J2EE', SkillThree:'PPT' }, regeditTime:new Date() } var workmate3={ name:'MinJie', age:20, sex:1, job:'UI设计', skill:{ skillOne:'PhotoShop', SkillTwo:'UI', SkillThree:'Word+Excel+PPT' }, regeditTime:new Date() } var db=connect('company') var workmateArray=[workmate1,workmate2,workmate3] db.workmate.insert(workmateArray) print('[SUCCESS]: The data was inserted successfully.');
- 上面的代码,我们以文件的形式向数据库中插入了3条数据。
这时候我突然发现UI职位的性别出现了错误,本来人家是个美女,这里缺写成了男,我们需要修改这条数据,但是经常会这样写。
这样写的问题是,我们的最后一条数据变成了只有sex:0,其它数据全部丢失了,这肯定不是我们想要的。这是新手在操作数据库修改时经常犯的一个错误,就是只修改变动的数据。 - 正确修改方法:
- 可以声明一个变量,然后把要改变数据的全部信息放入变量,最后执行修改操作。
var db=connect('company') var workmate3={ name:'MinJie', age:20, sex:0, job:'UI设计', skill:{ skillOne:'PhotoShop', SkillTwo:'UI', SkillThree:'Word+Excel+PPT' }, regeditTime:new Date() } db.workmate.update({name:'MinJie'},workmate3) print('[update]: The data was updated successfully');
- 这时候你需要删除(db.workmate.drop())表中的数据,因为MinJie这个用户已经不在数据库中了,然后重新使用load方法载入插入数据再进行修改。
//执行命令如下: db.workmate.drop() load('./demo02.js') load('./demo03.js')
- 现在这种方法才是正确的,数据修改正常了,但是你会发现写起来非常麻烦,而且特别容易写错。下节课我们会介绍update修改器,可以很好的解决这个问题。
五、修改:初识update修改器
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++