前情回顾
1.查找操作
find(query,field)
findOne(query,field)
2.query操作符
比较:$eq $lt $gt $lte $gte $in $nin
逻辑:$and $or $not $nor
数组:$all $size
其他:$exists $mod $type
3.数据处理函数
pretty() limit() skip() sort() count() distinct()
4.修改
updateOne(query,update,upsert)
updateMany(..................)
update()
findOneAndUpdate(query,update)
findOneAndReplace(query,doc)
5.修改器使用
$set $unset $rename
**************************************************************************
一.修改器的使用(续)
1.$inc:加法修改器
e.g. 所有文档年龄域加1
db.class0.updateMany({},{$inc:{age:1}})
e.g. 所有文档年龄域加1.5
db.class0.updateMany({},{$inc:{age:1.5}})
2.$mul:乘法修改器
db.class1.updateMany({},{$mul:{age:2}})
db.class1.updateMany({},{$mul:{age:0.5}})
e.g. 将han年龄乘以2
db.class0.updateOne({name:'Han'},{$mul:{age:2}})
*$inc $mul 操作数可以是正数,负数,整数,小数
3.$setOnInsert:当使用update*插入文档时作为补充内容
eg.当插入新文档时,gender:'m'也会插入
db.class0.updateOne({name:'Bob'},{$set:{age:19},$setOnInsert:{'gender':'m'}},{upsert:true})
db.class0.update({name:'Alic'},{$set:{age:22},$unset:{gender:''}}
4.$max : 指定某个域的值,如果小于规定值则修改为规定值,大于规定值则不变
eg.如果Tom的age小于20则改为20,大于20则不变
db.class0.updateOne({name:'Tom'},{$max:{age:20}})
5.$min : 指定某个域的值,如果大于规定值则修改为规定值,小于规定值则不变
eg.年龄大于25的修改为25
db.class0.updateMany({name:'Tom'},{$min:{age:25}})
db.class0.updateMany({},{$min:{age:19}})
6.数组修改器
[1]$push:向数组中添加一项
eg.向数组中增加一项97
db.class1.updateOne({name:'圣枷'},{$push:{score:97}})
[2]$pushAll:向数组中增加多项
eg.向数组中增加两项 5,10
db.class2.updateOne({name:'圣枷'},{$pushAll:{score:[5,10]}})
[3]$pull:从数组中删除某一个值(同值全删)
eg.删除小红score域中的5
db.class2.update({name:'圣枷'},{$pull:{score:5}})
eg.删除score数组中大于90的值
db.class1.updateOne({name:})
[4]$pullAll:同时删除数组中多个值
eg.同时删除数组中的88和10
db.class2.update({name:'圣枷'},{$pullAll:{score:[80,10]}})
[5]$pop:从数组中弹出一项
eg. 删除hehe 的score中最后一项 (1表示最后一项,-1表示第一项)
db.class1.update({name:'hehe'},{$pop:{score:1}})
[6]$addToSet:向数组中添加一项,但是不能添加已有的内容
eg.向数组中添加81,如果已经存在则无法添加
db.class1.update({name:'hehe'},{$addToSet:{score:96}})
[7]$each:对多个值进行逐一操作
eg.使用rech同时添加90,10
db.class1.update({name:'hehe'},{$push:{score:{$each:[90,10]}}})
[8]$position: 指定值的插入位置,配合each
eg.向数组1号位置插入55
db.class.update({name:'hehe'},{$push:{score:{$each:[5],$position:0}}})
[9]$sort :对数组排序,搭配each使用
eg.对hehe 的score数组排序,搭配each使用,1升序-1降序
db.class2.update({name:'hehe'},{$push:{score:{$each:[],$sort:1}}})
练习:使用之前的grade数据库
1.将小红的年龄修改为8岁,兴趣爱好变为跳舞画画
db.class.update({name:'小红'},{$set:{age:8,hobby:['dance','drow']}})
2.追加小明的兴趣爱好为唱歌
db.class.update({name:'小明'},{$push:{hobby:'sing'}})
3.小王多了兴趣吹牛,打篮球
db.class.update({name:'小王'},{$pushAll:{hobby:['吹牛','basketball']}})
4.小李兴趣增加跑步,唱歌,但是不能和已经有的一样
db.class.update({name:'小李'},{$addToSet:{hobby:{$each:['running,sing']}})
4.班级所有同学年龄加1
db.class.updateMany({},{$inc:{age:1}})
5.删除小明的性别属性
db.class.update({name:'小明'},{$unset:{sex:''}})
6.小李的第一个兴趣不要了
db.class.update({name:'小李'},{$pop:{hobby:-1}})
7.删除小红的爱好中的画画唱歌
db.class.update({name:'小红'},{$pullAll:{hobby:['drow','sing']}})
二. 删除文档
1.格式对比
mysql:delete from table where ...
mongo:db.collections.deleteOne(query)
2.删除函数的使用
[1]db.collection.deleteOne(query)
功能:删除第一个符合条件文档
参数:筛选条件,用法同find query
e.g. 删除第一个性别为男的文档
db.class1.deleteOne({sex:'m'})
e.g. 删除第一个年龄小于40的
db.class1.deleteOne({age:{$lt:40}})
[2] db.collection.deleteMany(query)
功能:删除所有复合条件的文档
参数:query筛选条件
{}全删
eg.删除所有不存在这个域的文档
db.class1.deleteMany({gender:{$exists:false}})
e.g. 删除所有年龄大于30性别为m的
db.class1.deleteMany({age:{$gt:30},sex:'m'})
[3]db.collection.remove(query,justOne)
功能:删除文档
参数:query 筛选条件
justOne 默认false 此时同deleteMany
justOne 设置true 此时同deleteOne
eg. 删除第一个性别为m的文档
db.class0.remove({sex:'m'},true)
*db.student.deleteMany({})可以删除集合中所有文档
[4]db.collection.findOneAndDelete(query)
功能:查找某个文档,并删除
参数:query
返回:返回查找到的文档
eg.查找第一个年龄为17的文档并删除
db.class0.findOneAndDelete({age:17})
三.数据类型
1.时间类型
[1]获取当前时间
(1)new Date()自动生成当前时间
eg.
db.class2.insertOne({book:'Python入门',data:new Date()})
(2)Date() 获取计算机时间生成字符串
eg.
db.class2.insertOne({book:'python精通',date:Date()})
[2]时间函数
ISODate(date) 将制定时间转换为mongodb存储时间
参数:()默认为当前ISO时间
('2019-01-01 11:11:11')通过字符串指定时间
('20190101 11:11:11')
('20190101')
e.g.
db.class1.insertOne({book:'Python精通',date:ISODate()})
db.class2.insertOne({book:'python放弃',date:ISODate('2019-01-01 11:11:11')})
[3]时间戳valueOf()
功能:根据标准时间(SIO date)生成时间戳
eg. 记录1970.1.1 00:00:00到现在多少毫秒
db.class2.insertOne({book:'Python涅磐',date:ISODate().valueOf()})
2.Null类型数据
[1]值:null
[2]含义:(1)表示某个域的值为空
eg.表示price域值为空
db.class2.insertOne({book:'Python Web',price:null})
(2)在表达示中表示某个域不存在
eg. 查找price域为null或者不存在这个域的文档
db.class2.find({price:null},{_id:0})
3.Object类型
[1]定义:文档中每个域的值为文档,则该文档称为object文档,即对象类型
[2]使用方法:当使用内部文档某个域的值时,需要使用"外部域.内部域"的格式获取。
此时该格式需要用引号标记字符串
eg.通过内部域title查找文档
db.class3.find({'book.title':'稻草人'},{_id:0})
e.g. 稻草人修改价格为35
b.class3.update({"book.title":'稻草人'},{$set:{'book.price':38}})
4.数组下标直接引用数组项
* 在使用数组时,可以直接通过数组域 . 数组下标操作数组的某一项值
eg.将hehe的score数组中第二项改为85
eg.db.class1.updateOne({name:'hehe'},{$set:{'score.1':85}})
练习:试用grade数据库完成
1.删除所有年龄小于8岁或者大于12岁的同学
deleteMany({$or:[{age:{$lt:8}},{age:{$gt:12}}]})
2.给小红第二项爱好改为 跳舞
updateOne({name:'小红'},{$set:{'hobby.1':'dance'}})
3.删除兴趣中没有画画的同学
deleteMany({hobby:{$nin:['drow']}})
4.给小王增加一个域,备注:{民族:'回族',习俗:'不吃猪肉'}
update({name:'小王'},{$set{备注:{民族:'回族',习俗:'不吃猪肉'}}})
5.给小王的备注,增加一项 宗教:'伊斯兰教'
update({name:'小王'},{$set:{'备注.宗教':'伊斯兰教'}})
四.索引
1.什么是索引?
索引是建立文档所在位置的查找清单,使用索引可以方便的进行快速查找,减少遍历次数,提高查找效率
2.索引约束
1. 索引本身也占有数据库空间,所以当数据量很小时没有必要创建索引消耗
2. 索引表需要根据数据的修改及时变更,此时会降低数据增删改的效率,
因此当数据库操作为大量的写操作而不是查找操作时不必创建索引
3.创建索引
db.collection.createIndex(index,option)
功能:创建索引
参数:索引域 和 索引选项
eg.为name域创建一个索引
db.class0.createIndex({name:1})
*_id域会由系统自动创建索引,且不能删除
*1表示正向索引,-1表示逆向索引
4.查看一个集合中的索引db.collection.getIndexes()
5.自定义索引名称
eg.通过第二个参数选项定义索引名称为age
db.class0.createIndex({age:1},{name:'Age'})
6.其他索引创建方法
ensureIndex()
功能:创建索引
参数:同createIndex()
createIndexes([{},{}])
功能:同时创建多个索引
参数:数组中存入多个索引键值对
eg.同时创建多个索引
db.class0.createIndexes([{name:-1},{age:-1}])
7.删除索引
(1)db.collection.dropIndex()
功能:删除一个索引
参数: 索引名或者键值对删除
eg.通过名称删除索引
db.class0.dropIndex("age_-1")
eg.通过键值对删除
db.class0.dropIndex({name:-1})
(2)db.collection.dropIndexes()
功能: 删除所有索引 (除了_id)
eg.删除class0中所有索引
db.class0.dropIndexes()
8.其他类型索引
(1)复合索引:根据多个域创建一个索引
e.g. 根据name age两个域(多个域)创建一个索引
db.class0.createIndex({name:1,age:-1})
(2)子文档/数组索引:
如果对某个域创建索引,该域的值为子文档或者数组,
则对数组或者子文档中某一项进行查找也是索引查找。
e.g. 如果对book域创建索引,则该查找也是索引查找
db.class3.find({'book.title':'围城'},{_id:0})
(3)唯一索引:要求创建索引的域,不能有重复的值
e.g. 对name域创建唯一索引
db.class0.createIndex({name:-1},{unique:true})
(4)稀疏索引:如果创建索引时某些文档不存在指定索引域则忽略这些文档
e.g. 对age域创建稀疏索引
db.class0.createIndex({age:1},{sparse:true})
五.聚合操作
1.定义:对文档进行数据整理,统计,获取(mongodb)
2.聚合函数
db.collection.aggrergate()
功能:完成聚合操作,获取操作数据
参数:聚合条件,配合聚合操作符使用
3.聚合操作符
[1]$gorup 分组聚合 需要配合一定的统计操作符完成
(1)统计求和:$sum
eg.按照性别分组,获取每组人数
db.class0.aggregate({$group:{_id:'$gender',num:{$sum:1}}})
eg.按性别分组,统计年龄之和
db.class0.aggregate({$group:{_id:'$gender',Age:{$sum:'$age'}}})
(2)统计求平均值:$avg
eg.按性别分组,求平均年龄
db.class0.aggregate({$group:{_id:'$gender',avg:{$avg:'$age'}}})
(3)求最大值:$max,$min
eg.按性别分组,求每组最大年龄
db.class0.aggregate({$group:{_id:'$gender',Max:{$max:'$age'}}})
db.class0.aggregate({$group:{_id:'$gender',Min:{$min:'$age'}}})
(4)求第一个数:$first
db.class0.aggregate({$group:{_id:'$gender',First:{$first:'$age'}}})
求最后一个数:$last
db.class0.aggregate({$group:{_id:'$gender',Last:{$last:'$age'}}})
[2]$project 用于获取指定域的集合文档数据
值的写法同find的field参数
用0表示不获取某一个域,用1表示获取某一个域
db.class0.aggregate({$project:{_id:0,name:1,age:1}})
e.g. 按照指定域名显示
db.class0.aggregate({$project:{_id:0,Name:'$name',Age:'$age'}})
作业:
1.完成银行系统中修改和删除操作练习
2.复习网络进程,线程使用
3.操作符和函数的使用