mongo shell 如果以前接触过数据库一定知道每个数据库都有自己独特的命令,MSSQL和MYsql用的都是Sql命令,MongoDB的操作命令就是前端最熟悉的JavaScript命令。
先来一个常用的赋值和输出命令,熟悉一下。(操作前你需要打开Mongo服务器和链接到服务器-也就是我们上节课讲的mongod命令和mongo命令)在命令行中输入以下代码。
var x='Hello World' print(x)
需要注意的是这里的输出不再使用console.log(‘巴拉巴拉’),而是使用print(‘巴拉巴拉’),这个稍有区别。
还可以定义函数:
function jspang(){ return 'JSPang'; }
学到这里,我们用的都是JavaScript的语法,这些我们可以信手拈来,非常容易。
MongoDB的存储结构
以前我们的关系型数据库的数据结构都是顶层是库,库下面是表,表下面是数据。但是MongoDB有所不同,库下面是集合,集合下面是文件。
在学习中我们可以对比记忆,这样才能更好的了解这些名词,其实数据表就是集合,数据行就是文件,当然这只是为了记忆,实质还是有区别的。
基础Shell命令:
了解存储结构后,就可以开始学习我们的基础Shell命令了。
- show dbs :显示已有数据库,如果你刚安装好,会默认有local、admin(config),这是MongoDB的默认数据库,我们在新建库时是不允许起这些名称的。
- use admin: 进入数据,也可以理解成为使用数据库。成功会显示:switched to db admin。
- show collections: 显示数据库中的集合(关系型中叫表,我们要逐渐熟悉)。
- db:显示当前位置,也就是你当前使用的数据库名称,这个命令算是最常用的,因为你在作任何操作的时候都要先查看一下自己所在的库,以免造成操作错误。
数据操作基础命令:
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文件。文件内容如下:
goTask.js文件
var 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
然后我们可以在命令行看到已经执行成功,可以到终端中进行查看插入结果。
在操作数据库时要注意两个能力:
第一个是快速存储能力。
第二个是方便迅速查询能力。
批量插入:
批量数据插入是以数组的方式进行的(如果写错,可以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');//打印出来
我测试的时间507ms,这个速度虽然和电脑性能有关,但还是不太理想,1000条数据用了将近半秒,组长会发飙的。
批量插入代码:
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');
这次用了17ms,性能远远超过循环插入。