1 概述
1.1 文件管理阶段
优点:可以长期保存 能存储大量数据
缺点:没有结构化的组织 查找不方便 数据容易冗余
1.2 数据库管理阶段
有文件存储的优点,同时解决了文件存储的问题
缺点 : 操作难度较高
数据 --> 数据库 --> 数据库管理系统 --> 数据库系统
2 数据库分类
2.1 关系型数据库
采用关系磨性来组织数据结构的数据库
常见数据库形式有:Oracle DB2 SQLServer Mysql sqlite
优点:
(1)容易理解,使用方便,sql语句本身比较成熟,而关系型数据库大都采用sql做数据操作
(2)易于维护,完整性好,数据一致性高
(3)通用化程度高,技术成熟,可以使用外链等操作
缺点:
(1)无法很好满足高并发需求,每次数据操作都需要解析sql语句,导致读写能力下降(一般该类型数据库都是用C / C++语言编写的,输入时采用sql语句,需要编译)
(3)针对海量数据的爆发处理能力不足,每次操作都要上锁
(4)扩展性不足
2.2 非关系型数据库 (Nosql not only sql)
优点:
(1)可以满足高并发需求,读写能力强
(2)支持分布式部署
(3)弱化了数据结构,降低了数据的一致性
缺点:
(1)发展比较晚,技术尚不成熟,比如缺少join等复杂性操作,通用性差,没有sql这样的语句
(2)结构灵活,灵活则会导致混乱,写法复杂
非关系性数据库(Nosql)适用那些情况
(1)数据磨性结构简单
(2)对数据的一致性要求低
(3)对数据的并发处理要求高
(4)对数据的扩展性有要求
非关系型数据库Nosql分类
(1)键值类数据库:
redis oracle DBD tokyo
如:name:张三
(2)列存储:
HBase
(3)文档型数据库:
MongDB
{ name:张三, sex:男}
(4)图形数据库
3 MongoDB数据库
3.1 数据库特点
(1)非关系型 文档型
(2)C++ 编写,支持分布式
(3)数据格式为bson类型,bson格式是jion的升级版,他丰富了json的数据类型
(4)功能比较前面
(5)支持众多编程语言接口 python ruby C# C++ PHP
3.2 MongoDB的安装
自动安装
在Linux系统中的安装步骤
(1)sudo apt -get update
(2)sudo apt -get install mongodb
默认安装目录:/var/lib/mongodb
配置文件:
/etc/mongodb.conf
/usr/bin
手动安装
(1)www.mongodb.com 下载安装包
(2)在目录下解压 /usr/local/opt
(3)解压后将文件夹中bin目录添加到环境变量中
export PATH = $PATH:/usr...
3.3 mongo的基本操作
在linux终端上输入mongo可以启动mongo shell
tarena@tedu:~$ mongo MongoDB shell version: connecting to: test
该模式下支持简单的语法
quit() 退出 mongo shell
mongod
--dbpath:指定数据目录,每个mongod进程都需要独立的数据目录,如果要是有3哥mongod实例,则必须有3个独立的数据目录;当mongod启动时,会在数据库目录中创建mongod.lock文件,这个文件用于防止其他的mongod纯净使用该数据目录
--port:指定服务器监听的端口号,默认端口号为27017,要运行多个mongo进程,则要给每个指定不同的端口号。
--logpath:指定日志的输出路径,如果对文件夹有读写权限,系统会在文件不存在时创建它,它会将已有文件覆盖掉;
--logappend:同logpath,但该选项可不会将原有文件覆盖,而是保留原来的日志
--config:指定配置文件,加载命令行未指定的各种选项
3.4 mongo的基本概念
为了对比,现将关系型数据库mysql与mongo进行对比
(1)MySQL与mongo基本含义对比
MySQL mongo 含义
database database 数据库
table collection 表/集合
column field 字段/域
row document 记录/文档(每一条信息称之为文档)
index index 索引
(2)数据形式对比
MySQL数据(表)结构形式
---------------------------
id | name | age
---------------------------
1 | Lily | 10
---------------------------
2 | Lucy | 11
---------------------------
mongo数据结构(字典)
{
'_id':ObjectId("xxxxxxxxxxxxxxxxxxx"),
'name': 'Lily',
'age': 10
},
{
'_id':ObjectId("xxxxxxxxxxxxxxxxxxx"),
'name': 'Lucy',
'age': 11
}
3.5 创建数据库
创建数据库:use dbname(dbname为数据库名)
注:
(1)use为选择使用的数据库,如果数据库不存在,则插入数据时会自动创建该数据库
实例:
tarena@tedu:~$ mongo MongoDB shell version: connecting to: test > use dbname switched to db dbname > # use 并不是直接将数据库创建起来,主要还是选择这个数据,只有真正创建这个表时,才是真正创建这个数据库 > show dbs admin (empty) local .078GB mongo_test .078GB > # 此时并没有显示dbname数据库,因里面并没有数据
(2)db(全局变量)表示当前正在使用的数据库,如果没有use选用目标数据库,则默认使用一个叫test的数据库
tarena@tedu:~$ mongo MongoDB shell version: connecting to: test > db test > use dbname switched to db dbname > db dbname
数据库的命名规则和特点
(1)数据库支持格式为utf-8
(2)数据库区分大小写,原则上都是小写;sql语句则不区分大小写
(3)命名也可以是utf-8格式,但不能是空字符串
(4)数据库名不能含有:空格、点、/ \ '\0'
(5)不能超过64字节
(6)数据库避免与诸如admin、local、config等数据库关键字冲突
注:admin(存储用户权限)、local(存储不想被分享复制的数据)、config(当分布式操作时才会出现,表示分片处理信息)
3.6 数据的备份与恢复
备份:
mongodump -h dbhost -d dbname -o dbdir
主机 数据库 文件夹
tarena@tedu:~$ mongodump -h 127.0.0.1 -d stu -o dbstudent connected to: 127.0.0.1 : DATABASE: stu to dbstudent/stu...
查找是否已经备份成功
tarena@tedu:~$ ls AID1709.csv dbstudent PycharmProjects 视频 下载 anaconda3 examples.desktop 公共的 图片 音乐 core java_error_in_PYCHARM_.log 模板 文档 桌面 tarena@tedu:~$ ls dbstudent/ stu
恢复数据
mongorestore -h dbhost -d dbname <path>
主机 将数据回复到那个数据库 要恢复数据库文件夹
tarena -d student student/stu connected ...
3.7 数据库删除
db.dropDatebase()
功能:删除当前数据库
3.8 数据库检测
tarena@tedu:~$ mongostat connected to: 127.0.0.1 insert query update delete getmore command flushes mapped vsize res faults locked db idx miss % qr|qw ar|aw netIn netOut conn time 640m .47g 35m test: 62b 4k :: 640m .47g 35m test: 62b 4k ::
具体截图
备注:insert (每秒的插入次数) query(每秒的查询次数) update(更新次数) delete(删除次数 )
3.9 检测数据库的读写时长
mongotop 监测数据库的读写时长
tarena@tedu:~$ mongotop connected to: 127.0.0.1 ns total : grid.system.namespaces 0ms 0ms 0ms grid.system.indexes 0ms 0ms 0ms grid.fs.files 0ms 0ms 0ms grid.fs.chunks 0ms 0ms 0ms grade.system.namespaces 0ms 0ms 0ms grade.system.indexes 0ms 0ms 0ms grade.class 0ms 0ms 0ms
截图显示
3.10 查看数据库
查看方式:show dbs
tarena@tedu:~$ mongo MongoDB shell version: connecting to: test > show dbs admin (empty) dbname .078GB local .078GB mongo_test .078GB > use stu switched to db stu > db.createCollection('class0') { "ok" : } > db.createCollection('class0') { "ok" : , "errmsg" : "collection already exists" }
4 集合
db.createCollection(collection_name)
功能:创建一个集合
参数:集合的名称
注:相当于 sql 语句中的表
4.1 集合的命名规则
(1)集合名不能以system . 开头,它是系统集合保留的前缀
(2)集合名称不要和关键字重名,不要带有$
(3)集合名能含有 ‘\0'
(4)集合也是utf-8字符串
4.2 集合的创建
db.collection_name.insert()
collection_name:集合名
当插入数据时,如果集合不存在则会自动创建;此也意味着,若将集合名称写错时也会创建新的集合并插入数据
4.3 查看数据库中的集合
tarena@tedu:~$ mongo MongoDB shell version: connecting to: test > show collections class3 system.indexes > show tables class3 system.indexes >
show collections 和 show tables 可以达到相同效果
4.4 集合的创建(一)
db.createCollection(collection_name)
功能:创建一个集合
参数:集合的名称
命名规则:
(1)集合也是utf-8 字符串
(2)不能含有'\0',因为最终是用c++来解析的,当存在'\0'时,c++就会默认为这是结束的
(3)不能以system.开头,他是系统集合的保留前缀
(4)集合名称不要和关键字重名 ,不要带有$,mongdb中好多关键字是有$引入的,也即,集合名称不要额操作符重名
4.5 集合的创建(二)
db.collection_name.insert()
当插入数据时,集合不存在时则会自动创建
如果将集合名称写错时,也会创建新的集合并插入数据
4.6 删除一个集合
删除指定的集合:db.collecton_name.drop()
> show collections abc class0 class1 system.indexes > db.abc.drop() true > show collections class0 class1 system.indexes
4.7 集合的重命名
db.collection_name.renameCollection(new_name)
参数:新的集合名称
> show collections class0 class1 system.indexes > db.class1.renameCollection('cls') { "ok" : } > show collections class0 cls system.indexes >
5 文档
在形式上类似于python中的字典,每个文档内部由 0个 或 多个 键值对构成,但文档不同于字典的是,文档是有序的。
bson:{'name':'licy','age':18}
键的命名规则:
(1)键值均为uft-8类型字符串,所以作为键时,加不加均可
,}) WriteResult({ "nInserted" : }) > db.class0.find() { "_id" : ObjectId("5abf2fe426803c9f334a1019"), "name" : "李四", "age" : } >
(2)不能有‘\0',一般不会以点.和 $ 开头,也不使用下划线_开头
(3)键不能重复
文档中的值:
指的是mongo数据库支持的数据类型
mongo支持的数据类型:
字符串 utf-8字符串均为合法字符串
整型 32位 和64位
布尔类型 true false 或者1 0来表示也可以
浮点型 小数
Arrays 用来存储数组胡列表
Timestamp 时间戳,存储时间节点
Date 时间类型,年月日时分秒
Symbol 字符串类型 通常用来存储特殊字符
Null null类型 表示空
object 文档类型(通常用于内部文件)
Binary data 二进制数据
code 代码 js
regex 正则表达式
ObjectId 系统自动生成的ID对象
在一个集合中文档的域不一定相同,也就是说键值对不一定完全相同
在一个文档中尽量选择意义相同的文档放入统一集合中
5.1 insert() 方法
db.collection.insert()
例如
,}) WriteResult({ "nInserted" : }) > db.class0.find() { "_id" : ObjectId("5abf2fe426803c9f334a1019"), "name" : "李四", "age" : } >
ObjectId("5abf2fe426803c9f334a1019")
_id:是系统自动提供的主键,
5abf2fe4 26803c 9f33 4a1019 24位16进制
文档创建时间 机器ID 进程ID 计数器
插入多条文档
insert([{},{},{}])
db.class0.insert([{'name':'王五',age:18,sex:'女'},{name:'张三',age:19,sex:'女'}])
insert() 插入数据时,也可以采用_id 来自定义插入id值,但id值不能重复。
5.2 save() 方法
db.collection.save()
实例
db.class0.,name:,sex:'女'})
注:
(1)当插入键值对中没有_id 域时,同insert
(2)当插入键值对有_id值,则会将拟插入的_id值与已插入的_id值进行匹配,如果匹配到已经插入的值,则会对相应文档进行修改,如果没有匹配到则其功能相当于insert(),将会插入到数据库中
(3)save() 无法插入多条数据
5.3 find() 查找
db.collection.find(query, field)
功能:查找文档
参数:
query 查找条件 {name:'张三'}
field 显示的域 {_id:0}
返回值:返回查找到的文档(返回第一条,先进先出,查找的第一条,也即先输入的第一条)
field的值的表示方式:{field:0|1}
0:表示不显示该域
1:表示显示该域
注:
(1)若将某个域设置为1,则表示其他域均为0
(2)若将某个域设置为0,则表示其他域均为1
(3)不允许同时设置1和 0
(4)_id 永远默认为1,也可将其设置为0
5.4 findOne()查找
db.collection.findOne(query, field)
功能:只查找第一条符合查找条件的数据
参数:同find一样
返回值:返回第一条匹配到的文档
5.5 获取集合对象
db.getCollection('class0') == db.class0
6 条件查找
6.1 比较操作符
= > < >= <= !=
$eq 等于
计算 age=20 的记录
db.class0.find({age:{$eq:}},{_id:})
$lt 小于
$lte 小于等于
$gt 大于
$gte 大于等于
$ne 不等于
例如:
db.class0.find({age:{$gte:,$lte:}},{_id:})
$in 包含
db.class0.find({age:{$})
$nin 不包含
db.class0.find({age:{$nin:})
6.2 逻辑操作符
and or not
$and 逻辑与
db.class0.find({$})
注:query 中逗号分割的多个条件默认就是and关系
$or 逻辑或
db.class0.find({$})
$not 逻辑非
db.class0.find({age:{$}}},{_id:})
$nor 既不是也不是
db.class0.find({$nor:})
6.3 混合查找
age or (namg = 张三 and sex != 女) db.class0.find({$}) db.class0.find({$})