mongoDB-3
前情回顾
1. 查找操作
findOne(query,field)
2. query 操作符
比较: $eq $lt $lte $gt $gte $ne $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()
findOneAndReplace()
5. 修改器
$set $unset $rename $setOnInsert
***************************************************
一. 修改器的使用(续)
1. $inc : 加法修改器
e.g. 所有人年龄加1
db.class1.updateMany({},{$inc:{age:1}})
2. $mul : 乘法修改器
e.g. 所有人年龄乘以0.5
db.class1.updateMany({},{$mul:{age:0.5}})
* $inc $mul 操作数可以是整数 小数 正数 负数
3. $max : 修改某个域的值,如果小于指定值则改为指定值,大于则不变
e.g. 如果age域小于30改为30,大于30则不变
db.class1.updateMany({sex:'w'},{$max:{age:30}})
4. $min :修改某个域的值,如果大于指定值则改为指定值,小于则不变
e.g. 将age大于30的文档,如果age大于40改为40
db.class1.updateMany({age:{$gt:30}},{$min:{age:40}})
数组修改器
1. $push 向数组中添加一项
e.g. 给小红score数组增加一个元素10
db.class2.updateOne({name:'小红'},{$push:{score:10}})
2. $pushAll 向数组中添加多项
e.g. 给小明score数组中增加多个元素
db.class2.updateOne({name:'小明'},{$pushAll:{score:[10,5]}})
3. $pull : 从数组中删除某个值
e.g. 删除小刚score数组中的90
db.class2.updateOne({name:'小刚'},{$pull:{score:90}})
4. $pullAll : 同时删除数组中多个值
e.g. 删除小明score数组多个值
db.class2.updateOne({name:'小明'},{$pullAll:{score:[69,5]}})
5. $pop : 弹出数组中一项
e.g. 弹出数组中最后一项 (1表示最后一项,-1表示第一项)
db.class2.updateOne({name:'小红'},{$pop:{score:1}})
6. $addToSet : 向数组中添加一项,但是不能和已有的数值重复
e.g. 向score增加80,但是不能和已有的重复
db.class2.updateOne({name:'小刚'},{$addToSet:{score:80}})
7. $each : 对多个值逐一操作
e.g. 对90 10 都执行push操作
db.class2.updateOne({name:'小红'},{$push:{score:{$each:[90,10]}}})
8. $position : 指定数据插入位置 配合$each
e.g. 将90 插入到 索引1位置
db.class2.updateOne({name:'小刚'},{$push:{score:{$each:[90],$position:1}}})
9. $sort : 给数组排序 配合$each使用
e.g. 将小红score数组按照降序排序 (-1降序,1升序)
db.class2.updateOne({name:'小红'},{$push:{score:{$each:[],$sort:-1}}})
练习 : 使用grade
1. 将小红年龄修改为8岁,兴趣爱好改为跳舞画画
updateOne({name:'小红'},{$set:{age:8,hobby:['dance','draw']}})
2. 小明多了一个兴趣爱好 唱歌
updateOne({name:'小明'},{$push:{hobby:'sing'}})
3. 小王兴趣爱好多个吹牛,打篮球
updateOne({name:'小王'},{$push:{hobby:['吹牛','basketball']}})
4. 小李兴趣增加跑步,唱歌,但是确保不和以前的重复
updateOne({name:'小李'},{$addToSet:{hobby:{$each:['running','sing']}}})
5. 班级所有同学年龄增加1
updataMany({},{$inc:{age:1}})
6. 删除小明的sex属性
updateOne({name:'小明'},{$unset:{sex:''}})
7. 小李第一个兴趣爱好不要了
updateOne({name:'小明'},{$pop:{hobby:-1}})
8. 小刚不喜欢计算机和画画了
updateOne({name:'小明'},{$pullAll:{hobby:['draw','computer']}})
二. 删除操作
1. 格式对比
mysql : delete from table where ...
mongo : db.collection.deleteOne(query)
2. 删除函数
db.collection.deleteOne(query)
功能: 删除第一个符合条件文档
参数: 筛选条件
e.g. 删除第一个不存在 gender域的文档
db.class0.deleteOne({gender:{$exists:false}})
db.collection.deleteMany(query)
功能: 删除所有符合条件文档
参数: 筛选条件
e.g. 删除所有小于18岁的文档
db.class0.deleteMany({age:{$lt:18}})
* 删除一个集合中所有文档
db.class1.deleteMany({})
db.collection.remove(query,justOne)
功能: 删除文档
参数: query 筛选条件
justOne=>false 删除所有符合条件文档(默认)
justOne=>true 只删除一个符合条件文档
e.g. 删除第一个性别为m的文档
db.class0.remove({gender:'m'},true)
db.collection.findOneAndDelete(query)
功能: 查找一个文档并删除之
参数: 查找条件
返回: 查找到的文档
e.g. 查找Levi并删除
db.class0.findOneAndDelete({name:'Levi'})
练习 : 使用grade
1. 删除所有年龄小于8岁或大于12岁的同学
deleteMany({$or:[{age:{$gt:12}},{age:{$lt:8}}]})
2. 删除兴趣爱好中没画画或跳舞的同学
deleteMany({hobby:{$nin:['draw','dance']}})
三. 一些数据类型
1. 时间类型
【1】 获取当前时间
* new Date() 自动生成当前时间
e.g.
db.class1.insertOne({book:'Python入门',date:new Date()})
* Date() 获取计算机当前时间生成字符串
e.g.
db.class1.insertOne({book:'Python精通',date:Date()})
【2】 时间函数
ISODate()
功能 : 将制定时间转换为标准时间存入
参数: 默认同 new Date() 获取当前时间
或者字符串制定时间
"2019-01-01 08:08:08"
"20190101 08:08:08"
"20190101"
e.g. 传入制定时间
db.class1.insertOne({book:'Python疯狂',date:ISODate("2019-01-01 08:08:08")})
【3】 时间戳
valueOf()
功能: 将标准时间转化为时间戳
e.g. 将标准时间转换为时间戳
db.class1.insertOne({book:'Python涅槃',date:ISODate().valueOf()})
2. Null 类型
【1】 值 : null
【2】 含义 :
* 表示某个域的值为空
e.g. price域的值为空
db.class1.insertOne({book:'Python Web',price:null})
* 查找时表示某个域没有
e.g. 查找到price域为null或者没有该域的
db.class1.find({price:null},{_id:0})
3. 内部文档(Object类型)
【1】 定义: 文档中某个域的值为内部文档,则该值为object类型数据
【2】 使用方法:当使用内部文档某个域的值时,需要采用个"外部域.内部域"的方法,此时该格式需要用引号表示为字符串
e.g. 找到出版社为中国文学的
db.class3.find({"intro.publication":'中国文学出版社'},{_id:0})
练习: grade
1. 将小红爱好的第二项变为 唱歌
updateOne({name:'小红'},{$set:{'hobby.1':'sing'}})
2. 给小王增加一个域
备注:{民族:'回族',习俗:'注意饮食禁忌'}
updateOne({name:'小王'},{$set:{备注:{民族:'回族',习俗:'注意饮食禁忌'}}})
3. 修改小王的备注域,增加一项
宗教 : '伊斯兰'
updateOne({name:'小王'},{$set:{'备注.宗教':'伊斯兰'}})
四. 索引操作
1. 什么是索引:索引是建立文档所在位置的查找清单,使用索引可以方便快速查找,减少遍历次数,提高查找效率
2. 索引约束: * 数据量很小时不需要创建索引
* 创建索引会增加磁盘的使用空间
* 对数据库操作大多时写操作而不是读操作时不宜创建索引
3. 创建索引
【1】 db.collection.createIndex(index,option)
功能: 创建索引
参数:索引域和索引选项
e.g. 为name域创建索引
db.class0.createIndex({name:1})
* _id域会由系统自动生成索引
* 1 表示正向索引,-1表示逆向索引
【2】 db.collection.getIndexes()
功能: 查看集合中索引
【3】 通过第二个参数定义索引名
e.g. 创建索引名字为ageIndex
db.class0.createIndex({age:-1},{name:'ageIndex'})
【4】 其他索引创建方法
ensureIndex()
功能: 创建索引
参数: 同 createIndex()
createIndexes([{},{}..])
功能: 创建多个索引
参数: 数组中写多个键值对
4. 删除索引
【1】 db.collection.dropIndex(index or name)
功能: 删除一个索引
参数: 索引名称或者键值对
e.g. 通过名称或者键值对删除
db.class0.dropIndex('name_-1')
db.class0.dropIndex({age:-1})
【2】 db.collection.dropIndexes()
功能 : 删除所有索引
* _id索引不会被删除
5. 其他类型索引
【1】 复合索引: 根据多个域创建一个索引
db.class0.createIndex({name:1,age:-1})
【2】object/数组索引 : 如果对object域或者数组域创建索引则针对object或者数组中某一个元素的查询也是索引查询
e.g. 如果对intro创建了索引,则该查找也是索引查找
db.class3.find({'intro.author':'曹雪芹'})
【3】 唯一索引 : 要求创建索引的域不能有重复值
e.g. 对name域创建唯一索引
db.class0.createIndex({name:1},{unique:true})
【4】 稀疏索引 : 如果创建稀疏索引则对没有索引域的文档会忽略
e.g. 对age 创建稀疏索引
db.class0.createIndex({age:1},{sparse:true,name:'Age'})
五. 聚合操作
1. 什么是聚合 : 对文档进行数据整理统计,得到统计结果
2. 集合函数
db.collection.aggregate(aggr)
功能: 执行聚合操作
参数: 聚合条件,配合聚合操作符使用
3. 聚合操作符
【1】 $group 分组聚合 需要配合统计操作符
* 统计求和 : $sum
e.g. 按性别分组统计每组人数
db.class0.aggregate({$group:{_id:'$gender',num:{$sum:1}}})
* 求平均数 : $avg
e.g. 按性别分组求平均年龄
db.class0.aggregate({$group:{_id:'$gender',num:{$avg:'$age'}}})
* 求最大最小值 : $max / $min
e.g. 按性别分组求每组的最大值
db.class0.aggregate({$group:{_id:'$gender',num:{$max:'$age'}}})
* $first/$last 求第一项值和最后一项值
【3】 $match 数据筛选
* match 值的写法同find函数中query写法
e.g. 筛选年龄大于18的文档
db.class0.aggregate({$match:{age:{$gt:18}}})
【4】 $limit 显示集合中前几条文档
e.g. 显示前3个文档内容
db.class0.aggregate([{$limit:3}])
【5】$skip 跳过前几个文档显示后面的内容
e.g. 跳过前3个文档显示后面内容
db.class0.aggregate([{$skip:3},{$project:{_id:0}}])
【6】 $sort 对集合文档排序
e.g. 对文档按年龄排序
db.class0.aggregate([{$sort:{age:1}},{$project:{_id:0}}])
4. 聚合管道
定义: 指将第一个聚合的结果交给第二个聚合操作继续执行,直到所有聚合完成。
形式: aggregate([{聚合1},{聚合2}...])
e.g. 查找年龄大于18的文档,不显示_id
db.class0.aggregate([{$match:{age:{$gt:18}}},{$project:{_id:0}}])