目录
day01
MongoDB (芒果数据库)
数据存储阶段
文件管理阶段(.txt .doc .xls)
- 优点:
- 数据可以长期保存
- 数据有一定格式化规范
- 可以大量存储
- 使用简单方便
- 缺点:
- 数据一致性差
- 用户查找修改不方便
- 数据冗余
数据库管理阶段:
- 优点:
- 数据组织结构化,降低了冗余
- 提高了增删改查的效率
- 便于扩展,方便程序调试做自动自动化处理
- 缺点:
- 数据库的使用专业性较强,相对比较复杂
几个概念
- 数据:能够输入到计算机中并被识别处理的信息的集合
- 数据结构:研究组成数据集合中数据之间关系的学科
- 数据库:按照数据结构,存储管理数据的仓库,是在数据管理系统软件管理和控制下创建在一定介质上的数据集合
- 数据管理系统:数据管理软件,用于维护管理数据库
- 数据库系统:由数据库,数据库管理系统,开发工具等组成的工具集合
关系型数据库
- 采用关系模型来组织数据结构的数据库(二维表)
- 对应的数据库:Oracle DB2 SQLServer Mysql Sqlite
- 优点:
- 容易理解,逻辑类似常见的表格
- 使用方便,都是用sql语句,sql语句非常成熟
- 数据一致性高,冗余低,完整度高,技术成熟,可以使用外部链接等复杂操作
- 缺点:
- 每次操作都需要SQL语句解析,消耗较大
- 不能很好的满足并发需求,应对海量数据爆发力不从心
- 关系型数据库内存存在大量的加锁操作,读写能力受到限制
- 数据不够灵活,有时候会导致结构复杂化
非关系型数据库(Nosql --> not only sql)
- 优点
- 高并发
- 扩展性强,使用灵活
- 弱化了数据结构,降低数据一致性
- 缺点:
- 通用性差,没有sql那么统一的操作语句
- 操作灵活,容易混乱
- 没有join等复杂操作,版本更新快
Nosql的使用情况
- 数据的一致性要求低
- 处理数据的海量并发
- 数据库大小不容易确定,需要分布扩散
- 给定的数据结构建立非关系模型更加容易
Nosql分类
- 键值数据库 Redis
- 列存储数据库
- 文档数据库 MongoDb
- 图形数据库
MongoDB(数据库非关系型数据库--> 文档型数据库)
- 由c++编写的数据库管理系统
- 支持丰富的增删改查功能
- 支持丰富的数据类型
- 支持众多的编程语言结构(python ohp c++ js c#)
- 在Nosql中技术相对比较成熟
MongoDB安装
- 自动安装
- 指令sudo apt-get install mongodb
- 默认安装路径:
/var/lib/mongodb - 配置文件位置:
/etc/mongodb.conf - 命令集:
/usr/bin /usr/local/bin - whereis 软件名:
查看一个软件的位置
- 手动安装(ubuntu)
- 下载合适版本的mongodb
www.mongodb.com--->get mongodb-->community server - 选择合适的位置解压 (/usr/local /opt)
tar 解压后得到Mongodb文件夹 - 将文件夹下bin文件夹加入到环境变量
(bin中就是命令集)
PATH=$PATH:/opt/mongo..../bin
export PATH
将以上两句写入 /etc/rc.local - 重启系统
- 下载合适版本的mongodb
Mongodb命令
- 设置数据库的存储位置
mongod --dbpath 目录
e.g.:mongod --dbpath abs - 设置数据库接口
mongod --port 8080
如果不设置默认 27017 - mongo
- 进入mongo shell
mongodb的交互模式,用于操作mongodb数据库 - 退出mongo shell
quit(),exit,或者ctrl+c
- 进入mongo shell
mongodb数据库组成结构
- 组织结构:键值对--》文档--》集合--》数据库
关系型数据库
------------------------------
ID | name | age
------------------------------
1 | Lily | 17
------------------------------
2 | Lucy | 18
------------------------------
键值对 —》 文档 —》 集合 —》数据库
{
"_id":1,
"name":"Lily",
"age":17
},
{
"_id":2,
"name":"Lucy",
"age":18
}
mysql 和 mongodb概念比较
mysql | mongodb | 含义 |
database | database | 数据库 |
table | collection | 表/集合 |
column | field | 字段/域 |
row | document | 记录/文档 |
index | index | 索引 |
数据库
- 创建数据库:use databaseName
e.g.:use stu #创建一个叫stu的数据库- 实际use是选择使用哪个数据库,当选择的数据库不存在时就会自动创建
- 只有向数据库中插入数据时数据库才会被真实创建出来,而use后不会马上创建
- 查看数据库:show dbs
- 系统数据库
admin:存放用户和权限
local:存放本地化数据
config:存储分片信息 - 数据库的命名规则
- 使用utf -8字符
- 不能含有空格 . / \ '\0' 字符
- 长度不能超过64字节
- 不能和系统数据库重名
- 习惯上使用小写字母,表达数据库的含义
- db:mongo系统全局变量,代表当前正在使用的数据库对象
当不使用use选择任何数据库的时候,db表示test,此时插入数据则创建test数据库 - 数据库的备份和恢复
- 备份:
备份:mongodump -h dbhost -d dbname -o dbdir 主机 要备份数据库 目录
e.g.:将127.0.0.1上的stu数据库备份到bak目录中
mongodump -h 127.0.0.1 -d stu -o bak -
恢复:
mongorestore -h host:port -d dbname dbpath 主机 数据库 目录
e.g.:将stu数据恢复到127.0.0.1上的student数据库中,如果student数据库不存在则自动创建
mongorestore -h 127.0.0.1:27017 -d student bak/stu
- 备份:
-
数据库监测命令
指令:mongostat
insert query update delete: 每秒执行增删改查次数
command : 每秒运行命令次数
flushes : 每秒清理缓存次数
vsize :使用的虚拟内存
res:物理内存 -
mongotop :监测每个数据库的读写时长
ns total read write 数据集合 总时长 读时长 写时长 -
删除数据库
db.dropDatabase()删除db代表的数据库
集合
-
创建集合
格式:db.createCollection(collection_name)
e.g. :创建一个class1的集合
db.createCollection(“class1”) -
创建集合2
当向一个集合中插入数据的时候,如果这个集合不存在则自动创建
db.collecionName.insert(...)
e.g.:如果class2不存在则自动创建
db.class2.insert({'name':'Tom','age':17}) -
查看数据库中集合
show tables
show collections -
集合的命名规则
-
合法的utf-8字符串
-
不能有'\0'
-
不能以 system.开头,是系统保留前缀
-
不能和关键字重复
-
-
删除集合
db.collection.drop()
e.g.:#删除class2这个集合
db.class2.drop() -
集合重命名
db.collection.renameCollection('new_name')
e.g.:将class 重命名为class0
db.class.renameCollection('class0')
文档
mongodb中数据的组织形式 –》 文档
mongodb文档 :以键值对形式组成的类似字典的数据结构结合.是对数据的一种描述
键: 即文档的域
命名规则:
- utf-8格式字串
- 不能有'\0'
- 一个文档中的键不能重复
- 文档中键值对是有序的
- mongodb严格区分大小写
值:即文档存储数据,也就是mongodb支持的数据类型
bson-->json-->JavaScript
类型 | 值 |
---|---|
整型 | 整数 |
布尔类型 | true false (小写) |
浮点型 | 小数 |
Array | 数组(类似列表,内存存储不是) |
Timestamp | 时间戳 |
Date | 时间日期 |
Object | 内部文档 |
Null | 空值 null |
String | 字符串 |
Symbol | 特殊字符串 |
Binary data | 二进制字符串 |
code | 代码 |
regex | 正则表达式 |
ObjectId | ObjectId对象 |
ObjectId
- "_id" : ObjectId("5b28a02c154710728ef6cac2")
- _id:如果在插入文档时没有哦指定_id域,则系统会自动添加该域作为主键,值则是一个ObjectId类型数据
- 24位 16进制数--》保证所有的_id值的唯一性
- 8位 文档创建时间
6位 机器ID
4位 进程ID
6位 计数器
集合中的文档
- 集合中的文档不一定域的个数相同
- 集合中的文档不一定有相同的域
- 集合中的文档,值的类型不一定相同
(关系型数据库:表决定字段,mongodb中 文档决定域)
集合设计原则
- 集合的文档应该尽可能描述同一类内容。有更多相同的域
- 同一类数据信息,不要过多分散集合存放
- 集合中文档的层次不要包含太多
插入文档
db.collection.insert()
-
插入单个文档
-
格式:
db.collection.insert()
-
e.g. db.class0.insert({'name':"Lucy","age":18})
db.class0.insert({name:"Tom",age:17,sex:'m'}) -
插入数据时域名可以不加引号
-
查看插入结果 db.class.find()
-
_id 为系统自动添加主键,如果自己写_id则为自己设 定的值,但是仍然不可重复
-
一个集合中的文档是有序的
-
-
插入多个文档
-
格式:
db.collection.insert([{},{},{}])
-
e.g.
db.class1.insert([{name:'阿宝',age:33,sex:'m'},{name:'阿蓉',age:27,sex:'w'},{name:'阿哲',age:32,sex:'m'}])
-
sava()插入文档
-
格式:db.collection.sava()
-
e.g:
db.class0.save({name:'Davil',age:16,sex:'m'})
db.class1.save([{name:'小白',age:30,sex:'w'},{name:'小陈',age:34,sex:'m'}])-
如果不使用_id则sava用法同insert一样
-
如果用_id项,此时文档已经存在时则会替换原有文档
-
获取集合对象
- 格式:db.getCollection("collection")
===> db.collection - e.g.:
db.getCollection("class1").insert({name:'老王',age:'36'})
作业:
- 关系型数据库和非关系型数据库有什么区别
- 介绍一下mongodb数据库
- 复习一下mysql
- 练习mongodb数据的创建,集合的创建删除,文档的插入