mysql 第十六节

1.NOSQL的优势:
-- 易扩展
-- 大数据量,高性能
-- 灵活的数据模型
-- 高可用


2.让关系数据库关注在关系上,NoSQL关注在存储上。

 

3.MongoDB 三元素:
1.三元素:数据库,集合,文档

 

4.mongodb的安装:

1.一步步安装,设安装路径 D:\mongodbinstall

2.D:\mongodbinstall 下新建文件夹data, 进入data新建db和log

3.进入D:\mongodbinstall\bin,开cmd,
开服务端:
mongod.exe --dbpath=D:\mongodbinstall\data\db

4.进入D:\mongodbinstall\bin,开cmd,
开客户端:
mongo.exe


5.mongodb可视化工具:
mongochef的安装

 


5.客户端:
--查看当前数据库名称
db

--连接成功后,默认使用test数据库

--查看所有数据库名称
show dbs

--切换数据库; 如果数据库不存在也并不创建,
-- 直到插入数据或创建集合时数据库才被创建
use 数据库名称

--删除当前指向的数据库,如果数据库不存在,则什么也不做
db.dropDatabase()

 

 

 

6.集合命令
-- 集合操作指令
-- 可以不手动创建集合,向不存在的集合中第一次加入数据时,集合会被创建出来
db.createCollection(name, options)

db.createCollection('stu')
db.createCollection("sub", { capped : true, size : 10 } )

show collections

--删除命令
db.stu.drop()

 

 

7.数据的增删改查:
-- 增 insert()
db.集合名称.insert({document})

db.stu.insert({name:'老王',age:18})

-- 查询
-- 参数都是可选的
db.stu.find()

-- 更新
-- update students set name = 'xiaowang' where id > 10;
db.集合名称.update(<query> ,<update>,{multi: <boolean>})

-- 修改年龄为18岁的学生名字为老宋 并且只修改一条
-- 1.改修改方式会修改文档结构 一般不适用
db.stu.update({age:18},{name:'老宋'})
-- 2.指定字段修改 $set
db.stu.update({age:18},{$set:{name:'老宋'}})

-- 修改年龄为18岁的学生名字为老马 修改所有满足条件的文档
db.stu.update({age:18},{$set:{name:'老马'}},{multi:true})


-- 保存 save()
db.集合名称.save(document)
-- 如果文档的_id已经存在则修改,如果文档的_id不存在则添加
例6
db.stu.save({_id:'20160102','name':'yk',gender:1})
例7
db.stu.save({_id:'20160102','name':'wyk'})

-- 删除
-- justOne: 可选的参数 默认是 false 删除所有满足条件的数据
db.集合名称.remove(
<query>,{justOne: <boolean>}
)

-- 删除年龄为18岁的学生,只删除一条数据
db.stu.remove({age:18},{justOne:true})
db.stu.remove({age:18})

-- 删除所有的数据
-- 第一个参数是必选的
db.stu.remove({})

 

8.创建固定尺寸的集合
-- 如果设置的固定大小小于256 默认就等于256
db.createCollection(name, options)
db.createCollection('sub',{capped:true,size:10})

db.sub.insert({title:'database',days:7})


9.查询
-- db.stu.insert({name:'郭靖',hometown:'蒙古',age:20,gender:true})
-- db.stu.insert({name:'黄蓉',hometown:'桃花岛',age:18,gender:false})
-- db.stu.insert({name:'华筝',hometown:'蒙古',age:18,gender:false})
-- db.stu.insert({name:'黄药师',hometown:'桃花岛',age:40,gender:true})
-- db.stu.insert({name:'段誉',hometown:'大理',age:16,gender:true})
-- db.stu.insert({name:'段王爷',hometown:'大理',age:45,gender:true})
-- db.stu.insert({name:'洪七公',hometown:'华山',age:18,gender:true})

1.比较运算符
-- 等于,默认是等于判断,没有运算符 :
-- 小于$lt less than
-- 小于或等于$lte less than equal
-- 大于$gt greater than
-- 大于或等于$gte greater than equal
-- 不等于$ne not equal

-- 查询年龄大于18岁的学生
db.stu.find({age:{$gt:18}})

-- 查询年龄大于或等于18,并且性别为true的学生
db.stu.find({age:{$gte:18},gender:true})

-- 查询年龄 在18 ~ 35之间的学生
db.stu.find({age:{$gt:18,$lt:35}})

2.逻辑运算符

-- 或 $or
-- 查询年龄大于18,或性别为false的学生
db.stu.find({$or:[{age:{$gt:18}},{gender:false}]})

-- 或和 且同事出现
-- 查询年龄大于18或姓名是郭靖,并且性别为男生
db.stu.find({$or:[{age:{$gt:18}},{name:'郭靖'}],gender:true})

3.范围运算符
db.stu.find({age:{$in:[18,28]}})

4.正则表达式
db.stu.find({name:/^黄/})
db.stu.find({name:{$regex:'^黄'}})

5.自定义查询
-- 自定义函数来完成查询条件的设置
-- js 的自定义函数 匿名函数, 必须得有一个 bool 类型的返回值
-- mongo 的终端其实也是一个 js 的编译器
-- $where
-- this 相当于 python self
db.stu.find({$where: function(){return 1 == 1 }})

db.stu.find({$where: function(){return this.age > 18 }})

db.stu.find(
{
$where: function(){
return this.age > 18
}
}
)

6.limit & skip
-- 在 find 查询中 limit 和 skip 不分先后顺序
db.stu.find().skip(4).limit(3)
db.stu.find().limit(3).skip(4)

7.投影:就是选择需要的字段
-- 第一个参数在投影的时候不能够省略
-- _id 是默认显示
db.stu.find({},{_id:0,name:1,age:1})

8.sort 排序
db.stu.find().sort({age:-1,gender:1})

9.统计个数
db.stu.find().count()
db.stu.count({age:{$gt:18}})

10.消除重复 distinct
--查找年龄大于18的学生,来自哪些省份
db.stu.distinct('hometown',{age:{$gt:18}})

 


11.聚合(aggregate)主要用于计算数据,类似sql中的sum()、avg()

1.语法 db.集合名称.aggregate({管道:{表达式}})
-- 常用管道 $group:$match:$project:$sort:$limit:$skip:$unwind:
-- 表达式 $sum $min $max $avg $first $last $push

-- $group 分组处理
-- 统计男生、女生的总人数
-- _id 表示分组的依据,分组的字段在管道中的使用需要注意添加$: '$字段'
-- $push 使用的时候 $$ROOT 用的非常多
db.stu.aggregate(
{
$group:{
_id:'$gender',
snumber:{$sum:1},
avgAge:{$avg:'$age'},
names:{$push:'$name'}
}
}
)

-- $match
-- 查询年龄大于20的学生
db.stu.find({age:{$gt:20}})

-- 聚合操作中的$match管道
db.stu.aggregate({$match:{age:{$gt:20}}})

-- 查询年龄大于20的男生、女生人数 格式:db.stu.aggregate([{},{}]) 或者 db.stu.aggregate({},{}),两种格式都行
db.stu.aggregate(
{$match:{age:{$gt:20}}},
{$group:{_id:'$gender',counter:{$sum:1}}}
)

-- $project 和投影操作非常类似
-- 查询年龄大于等于18的男生、女生人数,并且只显示人数
db.stu.aggregate(
{$match:{age:{$gte:18}}},
{$group:{_id:'$gender',counter:{$sum:1}}},
{$project:{_id:0,counter:1}}
)

-- $sort 排序
-- 查询年龄大于等于18的男生、女生人数,并且只显示人数,按照人数降序排序
-- 默认的排序是升序排序
db.stu.aggregate(
{$match:{age:{$gte:18}}},
{$group:{_id:'$gender',counter:{$sum:1}}},
{$project:{_id:0,counter:1}},
{$sort:{counter:-1}}
)

-- limit skip
-- 在聚合中 limit 和 skip 有先后顺序, skip 在前 limit 在后
-- 查询年龄大于等于18的男生、女生人数,并且只显示人数,按照人数降序排序, 只显示1条数据
db.stu.aggregate(
{$match:{age:{$gte:18}}},
{$group:{_id:'$gender',counter:{$sum:1}}},
{$project:{_id:0,counter:1}},
{$sort:{counter:-1}},
{$skip:1},
{$limit:1}
)

-- $unwind 拆分, 拆分集合中的列表类型的数据
-- 新建一个聚合
db.t2.insert(
{_id:1,
item:'t-shirt',
size:['S','M','L']
}
)
--按size分拆显示
db.t2.aggregate({$unwind:'$size'})
--防止数据丢失
db.t2.aggregate({
$unwind:{
path:'$size',
preserveNullAndEmptyArrays:true // #防止数据丢失
}
})

 


12.Mongo 索引
-- 插入100w 条数据
for (var i = 0; i < 10000; i++) {
db.test.insert({_id:i,name:'test'+i})
}

-- 先根据索引字段查询数据
db.test.find({_id:9999})
-- 先根据非索引字段查询数据
db.test.find({name:'test9999'})
-- 给 name 字段创建索引
db.test.ensureIndex({name:1}) //--1表示升序,-1表示降序
db.test.find({name:'test9999'})

-- 如何获取每次查询消耗的时间
db.test.find({name:'test9999'}).explain('executionStats')

-- 查看索引
db.test.getIndexes()
--删除索引
db.test.dropIndex('name')


13.数据备份与恢复:
--备份 mongodump -h dbhost -d dbname -o dbdirectory
sudo mongodump -d python -o ~/Desktop/

--恢复 mongorestore -h dbhost -d dbname --dir dbdirectory
mongorestore -d python2 --dir ~/Desktop/python

 

13.pymongo 与python交互

from pymongo import *

if __name__=='__main__':
try:
#创建连接对象
client=MongoClient(host='localhost',port=27017)
#获得数据库,此处使用python数据库
db=client.python

#向集合stu中插入一条文档
db.stu.insert_one({'name':'abc','gender':True})
#如果插入成功则提示ok
print('insert_one-----ok')

#查询多条文档
result=db.stu.find({'hometown':'大理'})
for item in result:
print('%s--%s'%(item['name'],item['hometown']))

#更新满足条件的所有文档
db.stu.update_many({'gender':True},{'$set':{'name':'haha'}})
print ('update_many----ok')

#删除满足条件的文档
db.stu.delete_one({'gender':True})
print('delete_one-----ok')

except Exception as e:
print(e)


14.超级管理员:
常用的的系统角色有:
-- root: 只在 admin 数据中可使用,超级账户,超级权限
-- Read: 允许用户读取指定的数据库
-- readWrite: 允许用户读写指定的数据库

创建超级用户
use admin

db.createUser(
{
user: 'admin',
pwd: '123',
roles:[{role:'root',db:'admin'}]
}
)


15.启用安全认证:(略)

 

posted @ 2019-09-29 09:12  霸龙涛  阅读(50)  评论(0)    收藏  举报