一、关系型数据库与非关系型数据库的对比
1、关系型数据库:
采用关系模型(二维表)来组织数据结构的数据库
oracle DB2 SQLServer Mysql SQLite
优点:*容易理解,逻辑类似常见的表格
*使用方便,都使用sql语句,sql语句非常成熟
*数据一致性高,冗余低,数据完整性好,便于操作
*技术成熟,功能强大,支持很多复杂操作
缺点:*每次操作都要进行sql语句的解析,消耗较大
*不能很好的满足并发需求,特别是海量数据爆发,关系型数据库读写能力会显得不足
*关系型数据库往往每一步都要进行加锁的操作,也造成了数据库的负担
*数据一致性高,有时也会使数据的存储不灵活
2、 非关系型数据库(NoSql)
优点:*高并发,读写能力强
*弱化数据结构一致性,使用更加灵活
*有良好的可扩展性
缺点:*通用性差,没有sql语句那样通用的语句
*操作灵活导致容易出错和混乱
*没有外键关联等复杂的操作
Nosql的使用情况:
1、对数据存储灵活性要求高,一致性要求低
2、数据处理海量并发,要求瞬间效率速度比较高
3、数据比较容易建立Nosql模型
4、网站灵活时缓冲存储,爬虫应用
Nosql 的分类:
1、键值型数据库 Redis
2、文档型数据库 MongoDB
3、列存储数据库 HBase
4、图形数据库
二、MongoDB数据库的使用
1、数据库的备份和恢复
备份:mongodump -h dbhost -d dbname -o bak
e.g.将本机stu数据库备份到bak目录下
mongodump -h 127.0.0.1 -d stu -o bak
恢复:mongorestore -h dbhost:port -d dbname path
e.g.将本地bak下stu数据库恢复到res数据库中(res不存在会自动创建)
mongorestore -h 127.0.0.1:27017 -d res bak/stu
2、 数据库的监测
(1)mongostat 用来监测数据库运行数据
insert query update delete :每秒增删改查的次数
flushes :每秒和磁盘的交互次数
vsize :虚拟内存
res : 物理内存
time:时间
(2) mongotop 监控数据库读写时长
ns :数据表
total:总时间
read :读时间
write:写时间
3、创建数据库:use databaseName
e.g.创建一个名字为stu的数据库:use stu
*use实际为选择使用哪个数据库,当数据库不存在时会自动创建
*use后并不会立即创建出数据库,而是需要等到插入数据时数据库才会创建
4、 查看系统中的数据库:show dbs
5、 删除数据库
db.dropDatabase()
删除db所代表的数据库
6、 创建集合
方法1:db.createCollection(collection_name)
e.g.创建class1集合:db.createCollection('class1')
方法2:
当向一个集合众插入数据的时候如果集合不存在则自动创建集合
7、 查看数据库集合
show collections 或 show tables
8、删除集合:db.collection.drop()
e.g. 删除class2集合
db.class2.drop()
9、 集合的重命名
db.collection.renameCollection("new_name")
e.g.将class重命名为class0
db.class.renameCollection("class0")
10、集合的文档
(1)集合中文档的特点:
1)集合中的文档不一定有相同的域
*个数不同
*域不相同
*数据类型不同
2)集合中文档各自比较独立,相互并不影响
(2) 插入文档:db.collection.insert()
插入单个文档
db.class0.insert({'name':'Lucy','age':18,'sex':'w'})
*查看插入结果 db.class0.find()
插入多条文档
db.class0.insert([{},{},{}])
**其他插入方法:
insertone() 插入一条文档
insertMany() 插入多条文档
**save插入文档
db.collection.save()
*如果正常插入与insert相同
*如果插入数据是有_id 域,且_id域值存在时则会修改原有文档,如果该值不存在则正常插入
e.g. db.class0.save({name:'Bob',age:19,sex:'m'})
db.class0.save([{name:'Sunny',age:18,sex:'w'},{name:'Alice',age:22,sex:'w'}])
11、查询操作:db.collection.find(query,field)
(1)查找所有内容:db.collection.find()
(2)find(query,field)
query:以键值对方式传递参数,如果是空则表示查找所有内容
field:以键值对的方式给出要查找(不查找)的域,
以域名为键,以0,1为值分别表示不查找和查找
e.g.db.class0.find({sex:'w'},{_id:0})
注意:*如果某一个或者多个域设置为0,表示这些域不查找,其他域均查找
*如果某一个或多个域设置为1,表示这些域查找,其他域均为不查找
*_id 除非设置为0否则均会查找
*除_id 域其他域不能有的设置为0,有的设置为1
e.g. 查找结果只有name域:db.class0.find({sex:'w'},{_id:0,name:1})
(3)findOne(query,field)
功能:查找第一条符合条件的文档
(4)query更多的筛选用法
操作符:使用$符号注明的一个特殊字符串,表达一定的含义,比如$lt 表示小于
比较操作符使用:
$eq 等于==
e.g.查找年龄为18 的文档 :db.class0.find({age:{$eq:18}},{_id:0})
$lt 小于 <
e.g. 查找所有年龄小于18的:db.class0.find({age:{$lt:18}},{_id:0})
db.class0.find({name:{$lt:'John'}},{_id:0})
$lte 小于等于 <=
e.g. 查找年龄小于等于18的:db.class0.find({age:{$lte:18}},{_id:0})
$gt 大于 >
e.g.查找年龄大于16小于19 的:db.class0.find({age:{$gt:16,$lt:19}},{_id:0})
*在mongodb中所有的{} []中都可以写多个条件,但根据参数的不同表达的意思不一样
$gte 大于等于 >=
e.g.查找年龄大于等于19的: db.class0.find({age:{$gte:19}},{_id:0})
$ne 不等于 !=
e.g. 查找性别不为‘w’的: db.class0.find({sex:{$ne:'w'}},{_id:0})
(5) 逻辑操作符
$and
在query中如果写多个条件默认即为and关系
e.g. db.class0.find({age:{$lt:18},sex:'m'},{_id:0})
逻辑与 $and
e.g. db.class0.find({$and:[{age:{$lt:18}},{sex:'m'}]},{_id:0})
逻辑或 $or
e.g. db.class0.find({$or:[{age:{$lt:16}},{age:{$gt:18}}]},{_id:0})
逻辑非 $not
既不也不 $nor
e.g. db.class0.find({$nor:[{sex:'m'},{age:{$lt:18}}]},{_id:0})
db.class0.find({$nor:[{name:{$lt:'Lucy'}},{age:{$gt:18}}]},{_id:0})
(6)逻辑条件混合
年龄大于 17 并且为 男性 或者姓名叫 Abby
db.class0.find({$or:[{age:{$gt:17}},{sex:'m'},{name:'Abby'}]},{_id:0})
年龄不大于18 或者 为女性 并且 姓名 大于Lucy
db.class0.find({$and:[{$or:[{age:{$lt:18}},{sex:'w'}]},{name:{$gt:'Lucy'}}]},{_id:0})