MongoDB (芒果数据库)
数据存储阶段
文件管理阶段 (.txt .doc .xls)
优点:使用简单方便
数据能够长期保存
可以存储大量数据
缺点:数据一致性差
数据的查找修改不方便
数据冗余
数据库管理阶段
优点:数据组织结构化,降低冗余
提高增删改查效率
方便扩展
方便程序调用,做自动化的处理
缺点:数据库使用特定的语句操作,相对复杂
几个概念
数据:能够输入到计算机并被识别处理的信息的集合
数据结构:研究一个数据集合中,数据之间关系的学科
数据库:按照数据结构,存储数据的仓库。在数据库管理系统管理下在一定介质上的数据集合。
数据库管理系统:管理数据库的软件,用于建立维护数据库
数据库系统:由数据库和数据库管理系统等开发工具组成的集合
关系型数据库
采用关系模型来组织数据结构的数据库 (二维表)
Oracle DB2 SQLServer MySql Sqlite
优点:容易理解,逻辑类似常见的表格
使用方便,都使用sql语句,sql语句很成熟
数据一致性高,冗余低,完整性好
技术成熟,可以使用外部关联等复杂操作
缺点:每次都需要sql语句的解析,消耗大
不能很好的满足并发需求,特别是海量数据爆发,读写能力不足
关系型数据库每一步操作都要加锁,以保证操作的原子性,增加了数据库负担
数据的一致性有时会导致空间浪费
非关系型数据库 (NoSql --> not only sql)
优点:高并发,读写能力强
普遍比关系型数据库容易扩展
弱化了数据结构,降低数据一致性
缺点:通用性差,没有sql语句一样的一致化操作
操作过于冗长,容易混乱
没有join等复杂操作,很多也不支持事务等操作
NoSql 使用情况
1.对数据一致性要求低
2.数据库需要处理海量并发
3.需要处理速度较快,比如做一个临时的中间过度存储器
4.数据库构建比较方便的构建非关系模型
NoSql分类
键值型数据库 :Redis
列存储数据库
文档型数据库 : MongoDB
图形数据库
MongoDB 数据库 (非关系型数据库--> 文档型数据库)
1. 由 c++ 编写的数据库管理系统
2. 支持丰富的增删改查操作
3. 支持丰富的数据类型
4. 支持众多的编程语音接口(python PHP c++ c#)
5. 使用方便,便于部署,相对成熟
MongoDB安装
自动安装
sudo apt-get install mongodb
默认安装位置: /var/lib/mongodb
配置文件:/etc/mongodb.conf
命令集: /usr/bin /usr/local/bin
(软件安装后提供功能性的命令)
手动安装
1.下载Mongodb(开源)
www.mongdb.com --> get mongodb --> community server
选择想要下载的版本
2.选择合适的位置解压(/usr/local /opt)
tar 解压后得到 MongoDB 文件夹
3.将命令集 (解压后文件夹中bin目录) 添加到环境变量
PATH = $PATH:/opt/mongo/bin
export PATH
将以上两句添加入 /etc/rc.local
4.重启系统
Mongodb 命令
设置数据库存储位置
mongod --dbpath 目录
e.g. mongod --dbpath dbs
设置数据库端口
mongod --port 8080
* 默认端口 27017
mongo
进入mongo shell界面:mongodb的交互界面,操作数据库
退出界面:quit() 或 ctrl + c
mongdb数据库组织形式
键值对 --> 文档 --> 集合 --> 数据库
--------------------
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 databasesName
e.g. use stu #创建一个stu数据库
* use 实际是表示选择某个数据库使用,当这个数据库不存在时会自动创建。
* 使用use后数据不会马上被创建,而是在实际写入数据时才会创建
查看当前系统中数据库
show dbs
系统数据库
admin:存放用户及其权限
local:存储本地数据
config:存储分片信息
数据库的命名规则
1.使用utf-8字符
2.不能有空格,点,/ \ '\0'字符
3.长度不超过64字节
4.不和系统数据库重名
db: mongodb系统全局变量,代表当前正在使用的数据库
* 如果没有use任何数据库情况下 db表示test,此时插入数据则创建test数据库
数据库的备份和恢复
备份:mongodump -h dbhost -d dbname -o dbdir
主机 要备份的数据库 目录
e.g.
将stu数据库备份到student目录中
mongodump -h 127.0.0.1 -d stu -o student
恢复:mongorestore -h dbhost:port -d dbname path
主机 数据库 目录
e.g.
将stu数据库恢复到student数据库中
mongorestore -h 127.0.0.1:27017 -d student student/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,"sex":"m"})
查看数据库中集合
show collections
show tables
集合命名规则
1.utf-8 字符
2.不能有'\0'
3.不要以system.开头,因为这是系统保留集合前缀
4.不要和关键字重复
删除集合
db.collectionName.drop()
e.g. db.class.drop() # 删除class这个集合
集合的重命名
db.collectionName.renameCollection("new_name")
e.g. 将class2重命名为class0
db.class2.renameCollection("class0")
文档
mongodb中数据的组织形式 --> 文档
mongodb文档:以键值对形式组成的类似字典的数据描述形式
键:即文档的域
键的命名规则:
1.utf-8字符串
2.不含有‘\0’通常不用 . $
3.一个文档中的键不能重复
* 文档中的键值对是有序的
* mongodb中数据严格区分大小写
值:即文档存储的数据 支持bson数据
javaScript ---> json ---> bson
类型 值
整形 整数
布尔类型 true false
浮点型 小数
Array 数组
Timestamp 时间戳
Date 时间日期
Object 内部文档
Null 空值 null
String 字符串
Symbol 特殊字符串
Binary data 二进制字串
code 代码
regex 正则表达式
ObjectId ObjectId字串
ObjectId
"_id" : ObjectId("5b503b9a6558da98a68bc062")
_id: 当在mongo代表中插入文档时,如果不指定_id则会自动添加这个域,作为主键
ObjectId() 值是系统自动生成的不重复字串标识
24位 8位 文档创建时间
6位 机器ID
4位 进程ID
6位 计数器
集合中的文档:
1.集合中的文档不一定有相同的域
2.集合中的文档多少不一定相同
3.集合中的文档,值的类型不一定相同
集合设计
1.集合中的文档尽可能描述同一类数据
2.同一类数据不要过多分散在多个集合中存放
3.集合中文档的结构层次不宜过多
插入单个文档
e.g.
db.class0.insert({name:"HanMei",age:17,sex:'w'})
*插入数据时域名可以不加引导
*查看插入结果 db.class.find()
* _id 为系统自动添加主键,如果自己写_id则为自己设定的值,但是仍然不可重复
*一个集合中的文档是有序的
插入多个文档
db.collectionName.insert([{},{},{}])
e.g.
db.class2.insert([{name:"阿宝",age:32,},{name:"阿哲",age:31},{name:"阿容",age:26}])
save() 插入文档
db.collectionName.save()
e.g.
db.class1.save({name:'Lily',age:13,sex:'w'})
* 如果不加_id域时用法同insert()
* 如果加_id,此_id值存在则save表示修改该文档
作业:
1.关系型数据库和非关系型数据库区别
2.复习mysql增删改查
3.练习mongo数据库集合创建删除,文档插入命令