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++ js c#)
5. 在NoSql 中技术相对比较成熟
Mongodb 安装
自动安装
sudo apt-get install mongodb
默认安装路径 : /var/lib/mongodb
配置文件 : /etc/mongodb.conf
命令集 : /usr/bin /usr/local/bin
whereis 软件名 : 查看一个软件的位置
手动安装
1. 下载合适版本的mongodb
www.mongodb.com ---> get Mongodb --> community server
2. 选择合适的位置解压 (/usr/local /opt)
解压后得到mongodb文件夹
3. 将文件夹下bin文件夹加入到环境变量
(bin中就是命令集)
PATH=$PATH:/opt/mongodb.../bin
export PATH
将以上两句写入 /etc/rc.local
4. 重启系统
Mongodb命令
设置数据库的存储位置
mongod --dbpath 目录
e.g. mongod --dbpath dbs
设置数据库端口
mongod --port 8080
* 默认27017
mongo 进入mongo shell
mongodb的交互模式,用于操作mongodb数据库
退出mongo shell : quit() 或者 ctrl-c
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. 创建一个叫stu的数据库
use stu
* 实际use是选择使用哪个数据库,当选择的数据库不存在时就会自动 创建
* 只有向数据库中插入数据时数据库才会被真实创建出来,而use后不会马上创建
查看数据库
show dbs
系统数据库
admin : 存放用户和权限
local : 存放本地化数据
config : 存储分片信息
数据库的命名规则
1. 使用utf-8字符
2. 不能含有空格 . / \ '\0' 字符
3. 长度不能超过64字节
4. 不能和系统数据库重名
* 习惯上使用小写字母,表达数据库的含义
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 使用虚拟内存大小
mongotop
监测每个数据读写时长
ns total read write
数据集合 总时长 读时长 写时长
删除数据库
db.dropDatabase()
删除db所代表的数据库
创建集合
db.createCollection(collection_name)
e.g. 创建一个叫class1的集合
db.createCollection('class1')
创建集合2
当向一个集合中插入数据的时候,如果这个集合不存在则自动创建
db.collection.insert(...)
e.g. 如果class2不存在则创建这个集合并插入数据
db.class2.insert({"name":"Lucy","age":18})
查看集合
show collections
show tables
集合的命名规则:
1. 合法的utf-8字符串
2. 不能有'\0'
3. 不能以 system. 开头。是系统的保留前缀
4. 不能和关键字重复
删除集合
db.collection.drop()
e.g. 删除class2集合
db.class2.drop()
集合重命名
db.collection.renameCollection("new_name")
e.g. 将class 重命名为class0
db.class.renameCollection("class0")
文档
mongodb中数据的组织形式 ---》 文档
mongodb文档 : 以键值对的形式组成的类似于字典的数据结构结合。
是对数据的一种描述
键 : 即文档的域
命名规则
1. utf-8 格式字串
2. 不能有'\0'
3. 一个文档中的键不能重复
* 文档中键值对是有序的
* mongodb严格区分大小写
值 : 即文档存储数据,也就是mongodb支持的数据类型
bson ---》json -----》 JavaScript
值类型 数值
整型 整数 1 2 3 -1 -3
布尔类型 true false
浮点型 小数 1.234
Array 数组 [1,2,3]
Timestamp 时间戳
Date 时间日期
Object 内部文档
Null 空值 null
String 字符串
Symbol 特殊字符串
Binary data 二进制字符串
code 代码
regex 正则表达式
ObjectId ObjectId对象
ObjectId
"_id" : ObjectId("5b764646d4ff0ad8f415f977")
_id : 如果在插入文档时没有指定_id域,则系统会自动添加该域作为 主键。值则是一个ObjectId类型数据
24 位 16进制数 --》 保证所有的_id值的唯一性
8位的 文档创建时间 6位 机器ID 4位 进程id 6位计数器
集合中的文档
* 集合中的文档不一定域的个数相同
* 集合中的文档不一定有相同的域
(关系型数据库: 表决定字段,mongodb中 文档决定域)
集合设计原则
1. 集合中的文档应该尽可能描述同一类内容。有更多相同的域
2. 同一类数据信息,不要过多分散集合存放
3. 集合中文档的层次不要包含太多
插入文档
db.collection.insert()
插入单个文档
e.g.
db.class0.insert({'name':"Lucy","age":18})
db.class0.insert({name:"Tom",age:17,sex:'m'})
* 查看插入结果 : db.class0.find()
* 文档中键可以不加引号
* _id为系统自动添加主键,如果自己写也可以,但是不能重复
插入多条文档
db.collection.insert([{},{},{}])
e.g.
db.class1.insert([{name:'阿宝',age:33,sex:'m'},{name:'阿蓉',age:27,sex:'w'},{name:'阿哲',age:32,sex:'m'}])
save 插入文档
db.collection.save()
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则save用法同insert一样
* 如果加_id项,此时文档已经存在时则会替换原有文档
获取集合对象
db.getCollection("collection")
===> db.collection
e.g.
db.getCollection("class1").insert({name:'老王',age:'36'