PYTHON2.day12
前情回顾
1.关系型数据库 和 非关系型数据库 的比较
*NoSql不是关系模型构建的数据库,不保证数据的一致性,结构灵活自由
*NoSql弥补了关系数据库在处理高并发数据请求时读写速度慢的缺点
*NoSql种类多样,技术成熟度不如关系模型,没有统一的操作语句,处于发展的上升阶段
2.MongoDB数据库的特点,安装,命令设置
3.MongoDB的组成结构
4.创建数据库
use database 创建数据库
db.dropDatabase()删除数据库
show dbs 查看数据库
mongodump 备份
mongorestore 恢复
mongostat 数据库监控
mongotop 数据库的读写时长
5.集合操作
db.createCollection() 创建集合
db.collection.insert() 集合不存在创建集合
db.collection.drop() 删除集合
db.collection.renameCollection() 重命名
db.getCollection('collection_name') 获取集合对象
show collection 查看集合
6.插入文档
insertOne() 插入一个文档
insertMany() 插入多个文档
insert()
save() 当ID冲突时可以修改原文档
********************************************************************************
一.查找操作
1.命令格式
mysql : select ... from table where ...
mongo : db.collection.find(query,field)
2.查找函数用法
1.find(query,field)
功能:查找所有符合条件的文档
查找集合中所有内容:db.collection.find()
参数:query 表示筛选条件,是一个键值对构成的文档,空文档,表示查找所有内容
field 表示要查找的域,事宜个键值对构成的文档,空文档表示查找所有的域
返回值:返回查找的所有文档
e.g.查找年龄为18的文档,性别为男的文档
db.class0.find({age:18})
db.class0.find({sex:'m'})
e.g. 不查找_id ,查找name,age域
db.class0.find({},{_id:0,name:1,age:1})
* _id域如果不想查找则写_id:0,查找则不写
* 除_id外其他域要么全为0表示不查找这些域,要么全为1表示查找指定的域
返回值:返回查找的所有文档
e.g.查找性别为m的文档,不查找_id域,只差name,age
db.class0.find({sex:'m'},{_id:0,name:1,age:1})
findOne(query,field)
功能: 查找第一条符合条件的文档
参数: 同find
e.g. 查找第一个年龄为18岁的文档
db.class0.findOne({age:18},{_id:0})
二.query
操作符:mongodb中使用$符号注明一个有特殊意义的字符串,用以表达丰富的含义.比如:$lt 表示小于
$eq 等于 =
eg.年龄等于17
db.class0.find({age:{$eq:17}},{_id:0})
$lt 小于 <
eg.年龄小于18
db.class0.find({age:{$lt:18}},{_id:0})
eg.姓名<Jame
db.class0.find({name:{$lt:'Jame'}},{_id:0})
$gt 大于 >
e.g. 大于16小于19的 (表达区间关系)
db.class0.find({age:{$gt:16,$lt:19}},{_id:0})
$lte 小于等于 <=
$gte 大于等于 >=
$ne 不等于 !=
$in 包含
e.g. 查找年龄在数组范围内的文档
db.class0.find({age:{$in:[15,16,19]}},{_id:0})
$nin 不包含
e.g. 查找年龄不包含在数组中的
db.class0.find({age:{$nin:[18,16]}},{_id:0})
三.逻辑操作符
[1]$and 逻辑与
1.在query文档中逗号隔开的键值对即表示与关系
eg.年龄18 并且 性别为男
db.class0.find({age:18,sex:'m'},{_id:0})
2.$and 表示逻辑与
eg.年龄18 并且 性别为男
db.class0.find({$and:[{age:{$lt:18}},{sex:'m'}]},{_id:0})
* 在query中,逗号分隔的多个条件也表示与关系
eg.年龄不等于17且性别为男
db.class0.find({$and:[{age:{$ne:17}},{sex:'m'}]},{_id:0})
[2]$or 逻辑或
eg.年龄小于17或性别为女
db.class0.find({$or:[{age:{$lt:17}},{sex:'w'}]},{_id:0})
[3]$not 逻辑非
eg.性别不是女
db.class0.find({sex:{$not:{$eq:'f'}}},{_id:0})
eg.年龄不大于17
db.class0.find({age:{$not:{$gt:17}}},{_id:0})
[4]$nor 逻辑既不也不 --> not (A or B)
eg.年龄既大于17,性别也不为男
db.class0.find({$nor:[{age:{$gt:18}},{sex:'m'}]},{_id:0})
[5]条件混合
eg.年龄(大于18 或者小于17)并且性别为男的
db.class0.find({$or:[{age:{$gt:18}},{age:{$lt:17}}],sex:'m'},{_id:0})
eg.年龄大于等于17的男生,或者 姓名叫Lily
db.class0.find({$or:[{age:{$gte:17},sex:'m'},{name:'Lily'}]},{_id:0})
四.数组查找操作符
数组:一组数据的有序集合,用[]表示
*有序性
*数据类型可以混合
1.查找数组中包含某一项
e.g. 查找数组中包含大于90的文档
db.class1.find({score:{$gt:90}},{_id:0})
2.查找数组中同时包含多项的 $all
e.g. 查找数组中同时包含80 75 的
db.class1.find({score:{$all:[80,75]}},{_id:0})
3.根据数组元素个数查找 $size
e.g. 查找数组中包含两个元素的
db.class2.find({score:{$size:2}},{_id:0})
4.选择数组的显示部分 $slice (用于field参数)
e.g.显示数组的前2项
db.class2.find({},{_id:0,score:{$slice:2}})
e.g.跳过第一项显示后面两项
db.class2.find({},{_id:0,score:{$slice:[1,2]}})
5.其他查找操作符
1.$exists 判断一个域是否存在 值为bool
eg.查找不存在score域的文档
db.class1.find({score:{$exists:false}},{_id:0})
2.$mod 通过除数和余数查找文档
eg. 查找age域除以2余数为0的
db.class0.find({age:{$mod:[2,0]}},{_id:0})
3.$type 根据值的数据类型筛选
eg. 查找age数据类型为1的文档
db.class0.find({age:{$type:1}},{_id:0})
* 数据类型和数字对照表参看文档 $type说明
* 没见过的操作符可以通过mongodb文档 search,查看文档说明
五.数据操作函数
1. db.collection.distinct(field)
功能:获取某个集合中某个域的值范围
参数:域名
返回值:取值范围数组
eg.查看class1中age域有哪些值
db.class1.distinct('age')
2. pretty()
功能: 将find结果格式化显示
db.class1.find().pretty()
3. limit(n)
功能: 显示find结果的前n条文档
参数:n指示显示数量
e.g. 显示查找结果的前3条
db.class1.find({},{_id:0}).limit(3)
4. skip(n)
功能:跳过前n条文档,显示后面的内容
eg. 跳过前5条文档,显示后面内容
db.class1.find({},{_id:0}).skip(5)
5. count()
功能:统计查询结果数量
eg. 统计有多少年龄大于17的文档
db.class0.find({age:{$gt:17}}).count()
6. sort({field:1/-1})
功能:对查找文档按照某个域的值排序
参数:表示要排序的域
eg. 对查找文档按年龄升序排序(1表示升序,-1表示降序)
db.class0.find({},{_id:0}).sort({age:1})
7. 复合排序:对多个域进行排序,当第一排序项相同时,参考第二排序项排序
eg. 按age降序,若age相同时,按照sex升
db.class0.find({},{_id:0}).sort({age:-1,sex:1})
8. 通过连续调用函数获取更丰富结果
[1]取年龄最大的三位
db.class0.find({},{_id:0}).sort({age:-1}).limit(3)
9. 通话序列号直接获取查找结果的某一项(0为第一项0)
eg.获取查找结果的第二项
db.class0.find({sex:'m'},{_id:0})[1]
练习
1.创建数据库名为 grade
2.在数据库中创建集合名为class
3.在集合中插入若干数据,格式
{name:xxx,age:xx,sex:xx,hobby:[xx,xx,xx]}
年龄:7--14
hobby:drow dance running sing football computer python
4.查看练习
查看班级所有人信息
db.class.find()
查看班级中年龄为8岁人员信息
db.class.find({age:8})
查看年龄大于10岁学生信息
db.class.find({age:{$gt:12}})
查看年龄在8-12岁之间的学生
db.class.find({age:{$gte:8,$lte:12}})
查看年龄为9 且喜欢画画的女生
db.class.find({age:9,hobby:'dance',sex:'g'})
查看年龄小8岁或大于12岁的学生
db.class.find({$or:[{age:{$lt:8}},{age:{$gt:12}}]})
查看年龄9岁或者11岁的学生
db.class.find({age:{$in:[9,11]}})
查找有两项兴趣的同学
db.class.find({hobby:{$size:2}})
查找喜欢计算机的同学
db.class.find({hobby:'computer'})
找到既喜欢画画又喜欢跳舞的学生
db.class.find({hobby:{$all:['dance','drow']}})
统计兴趣有三项的学生人数
db.class.find({hobby:{$size:3}})
找到本班年龄第二大的学生
db.class.find({}).sort({age:-1}).skip(1).limit(1)
查看班级中同学兴趣爱好范围
db.class.distinct('hobby')
找到班级中年级最小的三个男生
db.class.find({sex:'m'}).sort({age:1}).limit(3)
六.修改文档
1. 格式对比
mysql:update table set .. where ...
mongo:db.collection.updateOne(query,update,update)
2. 修改函数
[1]updateOne(query,update,upset)
功能:修改第一个符合条件的文档
参数:query筛选条件 用法同find
update 要修改的数据项,要同修改操作符一同使用
upset bool值,如果设置为true则如果没有筛选到文档会根据query和update参数插入新的文档
eg.将Aliex的年龄修改为30
db.class.updateOne({name:'Aliex'},{$set:{age:30}})
eg.如果没找到name为Abby的文档则插入新文档
db.class.updateOne({name:'Abby'},{$set:{age:18}},{upsert:true})
[2]db.collection.updateMany(query,update.upsert)
功能:修改所有符合条件的文档
参数:用法同updateOne
eg.修改所有年龄小于18的文档 年龄为21
db.class0.updateMany({age:{$lt:18}},{$set:21})
[3]db.collection.update(query,update,upsert,multi)
功能:修改文档
参数:query ,update用法用updateOne()
upset:功能同 updateOne()
写法直接赋值 upsert = true
multi:bool值 multi = false 同updateOne
multi = true 同updateMany
eg.修改所有年龄为 18的文档年龄为23
db.class0.update({age:18},{$set:{age:23}},false,true)
[4] db.collection.findOneAndUpdate(query,update)
功能:查找第一个符合条件文档并修改
参数:query 查找条件
update 修改内容
返回:返回修改前的文档
eg.查找第一个符合条件文档并修改
db.class0.findOneAndUpdate({age:23},{$set:{age:19}})
[5]db.collection.findOneAndReplace(query,doc)
功能:查找一个文档并替换
参数:query 查找条件
doc 要替换的文档
返回:被替换的文档
eg. db.class0.findOneAndReplace({},{name:'Lenzer',age:19})
3.修改操作符(修改器)
[1]$set:修改一个域的值或者增加一个域
eg.name域不存在时可以增加这个域
db.class0.updateOne({age:20},{$set:{name:'Joy'}})
[2]$unset:删除一个域
eg.删除Joy的age域
db.class0.updateOne({name:'Joy'},{$unset:{age:''}})
[3]$rename:给一个域重命名
eg.将所有域名sex修改为gender
db.class0.updateMany({sex:{$exists:true}},{$rename:{sex:'gender'}})