《快速掌握 MongoDB 数据库(一)》笔记-阿里云大学

过了一遍MYSQL之后,开始继续过NoSQL的部分,因为之前感觉阿里云大学的课程总体还是不错,所以继续跟着课程走。

简单猫了一眼MongoDB的课程,虽然是2015年的,而且还是基于WINDOWS的环境搭建安装和准备,但是总体技术体系应该不会有颠覆性改变,而且既然是阿里云推荐的系列课程,就它吧。

1、MongoDB简介

MongoDB数据库是一种NoSQL数据库,NoSQL数据库不是这几年才有的,从数据库的初期发展就已经有了NoSQL数据库。数据库之中支持的SQL语句是由IBM开发出来的,并且最早就应用在了Oracle数据库,但是SQL语句的使用并不麻烦,就是几个简单的单词,SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY。但是在这个时候有人开始反感于编写SQL操作。

微软的最早也是反感SQL,搞了FOXPRO。

有一些人就开始提出一个理论——不要去使用SQL,于是最早的NoSQL概念产生了。可是后来的发展产生了一点变化,在90年代到2010年之间,世界上最流行的数据库依然是关系型数据库,并且围绕着关系型数据库开发出了大量的程序应用。后来又随着移动技术(云计算、大数据)的发展。

ORACLE的RAC跨节点共享,但是配置非常复杂,谁要是能搞定了就牛逼大了这辈子就可以吃ORACLE了。

很多公司不愿意去使用大型的厂商数据库 —— Oracle、DB2,因为这些人已经习惯于使用MySQL数据库了。这些人发现在大数据与云计算的环境下,数据存储受到了很大的挑战,那么后来就开始重新进行了NoSQL的数据库开发,但是经过长期的开发,发现NoSQL数据库依然不可能离开传统的关系型数据库(NoSQL,Not Only SQL)。

关系型数据的数据流转:数据表 => JDBC读取 => POJO(VO、PO)=>控制层转化为JSON数据 => 客户端

可是这样的转换实在是太麻烦了,那么最好的做法是,直接有一个数据库就存放有要显示的数据就行了,就省略所有需要进行转换的过程。所以在实际的开发之中,往往除了关系型数据库之外还要提供一个NoSQL数据库,其中NoSQL数据库负责数据的读取,因为直接保存的就是JSON(前提:MongoDB中的数据是排列好的组合数据)

例如:现在要求显示出每个雇员的编号、姓名、职位、部门名称、部门位置、工资等级。传统的关系型数据库中一定要存放大量的冗余数据,不合理。而有了NoSQL数据库之后,可以直接在业务层里面将数据交给NoSQL数据库保存,按照指定的结构进行存储。

在MongoDB数据库之中,与Oracle数据库有如下的概念对应:

NO 关系型数据库 NoSQL数据库
1 数据库 数据库(类似于MySQL,而不是Oracle要起个服务)
2 集合
3 文档
4 成员
5 主键 Object ID(自动维护)

在整个行业之中,MongoDB数据库是发展最好的一个NoSQL数据库,因为它与Node.JS捆绑在一起了,也就是如果你要从事Node.JS的卡覅,那么一定要使用MongoDB,而Node.JS(基于JavaScript)在国内最成功的应用——taobao(当然taobao也不是仅依赖MongoDB)。

MongoDB之所以能够更好的发展也取决于:面向集合的存储过程、模式自由(无模式)、方便的进行数据的存储扩充、支持索引、支持短暂数据保留、具备完整的数据库状态监控、基于BSON应用。

关系型数据库和NoSQL数据库是互补的存在。

2、MongoDB的安装与配置

如果想得到MongoDB数据库只需要登录(www.mongodb.org)上就可以直接下载可用版本,为了尽量匹配课程(课程内使用的是3.0.3版本),这里找到3.0.15版本,以压缩包(解压即可用)的方式下载。

我这里的做法是,将ZIP包放到D盘直接解压缩,改文件夹名称为mongodb-3.0.15。然后配置下环境变量,mongoDB的安装目录下的bin目录设置为环境变量(直接搞到系统Path变量即可)。

如果要想正常启动MongoDB数据库,那么必须建立一个文件夹,这个文件夹将保存所有的数据库的信息。将在MongoDB文件夹之中建立一个db的目录,并且在此目录下保存所有的数据文件。

MongoDB数据库的启动需要使用mongod.exe命令完成。

不设置端口号启动:

mongod --dbpath {安装目录}\db

设置端口号启动:

mongod --dbpath {安装目录}\db --port=27000

如果日后需要通过程序访问数据库的话,那么一定要设置端口号。

当MongoDB服务启动之后,可以使用mongo命令连接数据库。

开cmd,直接输入mongo回车即可(没有端口号的情况下)

范例:查询所有的数据库(MongoDB区分大小写):

show databases;

此时只存在有一个local的本地数据库,不过这个数据库不使用。

虽然以上的代码实现了数据库的启动与连接操作,但是从严格意义上来讲以上的代码没有任何的用处,因为从实际的开发来讲,在MongoDB启动的时候需要设置一些相应参数:端口号、是否启用用户验证、数据文件的位置等。

范例:在D:\mongodb-3.0.15目录下建立一个文件mongodb.conf(内容如下),同时建立了一个保存日志信息的文件夹和文件:log\mongodb.log

#设置数据目录的路径
dbpath = D:\MongoDB-3.0.15\db
#设置日志信息的文件路径
logpath = D:\MongoDB-3.0.15\log\mongodb.log
#打开日志的输出操作
logappend = true
#在以后进行用户管理的时候使用它
noauth = true
port = 27001

随后重新启动MongoDB数据库:

mongod -f D:\MongoDB-3.0.15\mongodb.conf

切换到admin数据库:

use admin

关闭数据库服务:

db.shutdownServer()

范例:连接数据库(此时服务器已经有指定的端口号了,使用客户端cmd)

mongo --port=27001

使用端口号启动在日后的程序开发部分是非常有用的。

3、MongoDB的基础操作

在MongoDB数据库里面是存在有数据库的概念,但是没有模式(所有的信息都是按照文档保存的),保存数据的结构就是JSON结构,只不过在进行一些数据处理的时候才会使用到MongoDB自己的一些操作符。

1)使用mldn数据库:

use mldn

实际上这个时候并不会创建数据库,只有在数据库里面保存集合数据之后才能真正创建数据库。也即这个时候如果show databases看不到。

2)创建一个集合——创建一个emp集合

db.createCollection("emp")

show databases 时可以看到了,这个时候mldn数据库才会真正的存在。

3)但是很多的时候如果按照以上的代码形式进行会觉得你不正常,因为正常人使用MondoDB数据库集合操作的时候都是直接向里面保存一个数据。

db.dept.find();

上述指令对应MYSQL类似于select * from emp

db.dept.insert({"deptno":10,"dname":"财务部","loc":"北京"});

4)查看所有集合

show collections;

发现dept集合自动创建了,所以一般做法就不需要专门创建库和集合了。

5)查看dept集合的数据

db.集合名称.find({若干条件})

如最简单的是 db.dept.find(); 从传统的数据表来看(集合就相当于表的结构),表的结构一旦定义就必须按照其定义的要求进行内容的编写,但是MongoDB不一样,它可以自己随意扩充数据。

6)增加不规则的数据

var deptData = {
	"deptno":20,
	"dname":"研发部",
	"loc":"深圳",
	"count":20,
	"avg":8000.0
};
db.dept.insert(deptData);

此时再用db.dept.find()是可以看到结构不一样的数据的。

再来一个(少了一些字段):

var deptData = {
    "deptno":20,
    "dname":"研发部"
};
db.dept.insert(deptData);

此时再用db.dept.find()是同样可以看到结构不一样的数据的。

既然结构保存是不规则的,因此不存在查看集合结构的语句

此时dept集合的内容可以由用户随便去定义,完全不用考虑其它的结构,那么实际上就必须明确一点了,在MongoDB数据库里面,是绝对不可能存在有查看集合结构的操作。

7)关于ID的问题
在MongoDB集合中的每一行记录都会自动的生成一个形如
    "_id" : ObjectId("6042e4ae66e3d7da35f7d60c")
的数据,这个数据组成是:“时间戳+机器码+进程pid+计数器”,这个ID的信息是MongoDB数据库自己为用户生成的。

8)查看单独的一个文档信息。

db.dept.findOne();

9)删除数据

db.dept.remove({"_id" : ObjectId("6043b30f4acb1e69fc57d216")})


10)更新

var deptData = {
    "deptno":50,
    "dname":"乞讨部",
    "loc":"家里蹲",
    "count":60,
    "avg":9000.0
};
db.dept.update({"_id" : ObjectId("6043b4094acb1e69fc57d217")},deptData);

11)删除集合

db.dept.drop();

12)删除数据库(当前所在的数据库)

db.dropDatabase()

删除数据库是删除当前所在的数据库,必须先切换到数据库才可以删除。

猜你喜欢

转载自blog.csdn.net/zlb_19850509/article/details/114436334
今日推荐