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}}])

 

posted @ 2019-09-04 19:11  华丽的飘过  阅读(274)  评论(0编辑  收藏  举报