笔记_mongo_03_索引聚合

版权声明:根据课题笔记整理复制而来 https://blog.csdn.net/weixin_42587525/article/details/83552026

mongo_03_索引聚合


修改器的使用

db.collection.update(query, update, upsert, multi)

$set: 修改一个域的值,或者(当一个域不存在时)增加一个域

eg.:
修改名为jame的文档的sex域的值
db.class0.update({name:‘Jame’},{$set:{sex:‘m’}})

$unset: 删除一个域

eg.:
删除一个文档的sex域
db.class0.update({name:‘Tom’},{$unset:{sex:’ '}})

rename: 重命名一个域

eg.:
把sex域名改为gender
db.class0.update({ }, {rename:{sex: ‘gender’}})

setOnInsert:  当update插入文档时,作为补充插入内容

eg.:
插入新的文档时,sex:'w’也会作为文档的域
db.class0.update({name:‘Lucy’},{ s e t : a g e : 20 , set:{age:20}, setOnInsert:{sex:‘w’}},true)

$inc:  加法修改器

eg.:
所有人的年龄域的值加1
db.class0.updateMany({ },{$inc:{age:1}})

$mul:  乘法修改器

eg.:
所有人的年龄域的值乘以2
db.class0.updateMany({ },{$mul:{age:2}})

所有人的年龄域的值除以2
db.class0.updateMany({ },{$mul:{age:0.5}})

$inc / $mul 的值可以是整数,小数,整数,负数

$max: 指定某个域的值如果大于规定值则不变,小于规定值则改为规定值

eg.:
如果Selina的age小于18则改为18,大于18则不变
db.class0.update({name:‘Selina’},{$max:{age:18}})

$min: 指定某个域的值如果小于规定值则不变,大于规定值则改为规定值

eg.:
如果Selina的age大于18则改为18,小于18则不变
db.class0.update({name:‘Selina’},{$min:{age:18}})


数组修改器

$push:  向某个域的数组中,增加一项

eg.:
给小明的分数项数组中增加一个值
db.class3.find({name:‘小明’},{_id:0})
{ “name” : “小明”, “score” : [ 78, 85, 90 ] }
db.class3.update({name:‘小明’},{$push:{score:5}})
db.class3.find({name:‘小明’},{_id:0})
{ “name” : “小明”, “score” : [ 78, 85, 90, 5 ] }

$pushAll: 向某个域的数组中,增加多项

eg.:
给小红的分数项数组中增加两个值
db.class3.update({name:‘小红’},{$pushAll:{score:[10,5]}})

$pull: 从数组中删除某一个值,(如果有重复值,则都删除)

eg.:
删除小红的score域中,所有的5
db.class3.uodate({name:‘小红’},{$pull:{score:5}}}

$pullAll: 从数组中删除多个值

eg.:
删除小红的score域中,的多个值
db.class3.update({name:‘小红’},{$pullAll:{score:[10,5]}})

$pop: 弹出删除数组中的一项(第一项/最后一项)

eg.:
从数组中弹出一项,1表示弹出最后一项 -1表示弹出第一项
db.class3.update({name:‘小明’},{$pop:{score:-1}})

$addToSet: 向数组中添加一项,但是不能添加数组中已有的数值

eg.:
向数组中添加一项80,如果已经有80,则添加不上
db.class3.update({name:‘小红’},{$addToSet:{score:80}})

$each: 逐一执行某项操作

eg.:
db.class3.update({name:‘小红’},{$push:{score:{$each:[90,10]}}})
db.class3.find({name:‘小红’},{_id:0})
{ “name” : “小红”, “score” : [ 88, 85, 89, 80, 90, 10 ] }

$position: 指定位置插入数值,搭配each使用

eg.:
将91插入到数组的1号(索引)位置
db.class3.update({name:‘小红’},{$push:{score:{ e a c h : [ 91 ] , each:[91], position:1}}})
db.class3.find({name:‘小红’},{_id:0})
{ “name” : “小红”, “score” : [ 88, 91, 85, 89, 80, 90, 10 ] }

$sort: 对数组进行排序,搭配$each使用

eg.:
对小红的score域的数组进行升序(1)排序,降序则为-1
db.class3.update({name:‘小红’},{$push:{score:{$each:[ ],$sort:1}}})
db.class3.find({name:‘小红’},{_id:0})
{ “name” : “小红”, “score” : [ 10, 80, 85, 88, 89, 90, 91 ] }


时间类型

获取当前时间:

new Date( ) 自动生成当前时间

eg.:
new Date( ) 生成格林威治时间
db.class1.insert({book:‘python’,date:new Date( )})
{ “book” : “python”, “date” : ISODate(“2018-10-30T03:29:17.694Z”) }

ISODate( ) 自动获取当前时间

eg.:
ISODate( )  生成格林威治时间
db.class1.insert({book:‘python2’,date:ISODate( )})
{ “book” : “python2”, “date” : ISODate(“2018-10-30T03:31:54.070Z”) }

Date( ) 获取计算机系统时间,生成时间字符串

eg.:
Date( ) 获取系统时间,生成时间字符串
db. db.class1.insert({book:‘python3’,date: Date( )})
{ “book” : “python3”, “date” : “Tue Oct 30 2018 11:36:00 GMT+0800 (CST)” }

获取任意时间

ISODate( )
功能:将指定的时间转换为MongoDB的存储时间类型
参数:指定的时间
“2018-01-01 11:11:11”
“20180101 11:11:11”
“20180101”

eg.:
将字符串中的时间转换为ISODate存储
db.class1.insert({book:‘python4’,date:ISODate()})
{ “book” : “python4”, “date” : ISODate(“2018-10-30T03:45:11.830Z”) }

valueOf( ):  将标准时间转换为时间戳

eg.:
db.class1.insert({book:‘python4’,date:ISODate().valueOf()})
{ “book” : “python4”, “date” : 1540871205550 }


NUll类型数据

值为Null
作用一:表示某个域的值为空

eg.:
price的值为空
db.class1.insert({book:‘python5’,price:‘Null’})

作用二:表达某个域的值不存在

eg.:
查找gender域不存在的文档(或者gender域值为null)
db.class0.find({score:null},{_id:0})


内部文档 (object)

文档中某个域的值还是一个文档,则这个文档是内部文档
当使用内部文档某个域的值时,需要用”外部文档域.内部文档域“的方法来应用,此时需要加引号注明.

eg.:
找出书名为狂人日记的文档
db.class2.find({‘book.title’:“狂人日记”},{_id:0})
{ “name” : “鲁迅”, “book” : { “title” : “狂人日记”, “price” : 36.8, “publication” : “人民教育出版社” } }
狂人日记的价格改为50
db.class2.update({‘book.title’:“狂人日记”},{$set:{“book.price”:50}})


通过数组下标直接引用数组项

在使用数组时,可以通过数组下标的方式选中数组中具体某一项进行操作。

eg.:
查找分数的第一项(即’score.0’)大于80的人
db.class3.find({‘score.0’:{$gt:80}},{_id:0})
{ “name” : “小明”, “score” : [ 85, 90, 5 ] }
{ “name” : “小亮”, “score” : [ 88, 79, 90 ] }

练习

基于之前的grade数据库
1.将a的年龄改为8岁,兴趣爱好改成跳舞,画画
db.class.update({name:'a'},{$set:{age:8,hobby:['draw','dance']}})
 
2.追加b的爱好 唱歌
db.class.update({name:'b'},{$push:{hobby:'sing'}})
 
3.c多了兴趣爱好,吹牛,打篮球
db.class.update({name:'c'},{$pushAll:{hobby:['talk','basketball']}})
 
4.d兴趣班要新增跑步,唱歌,但是不要和之前的重复
db.class.update({name:'d'},{$addToSet:{hobby:{$each:['running','sing']}}})
 
5.该班级所有人年龄加1
db.class.updateMany({ },{$inc:{age:1}})
 
6.删除b的sex属性
db.class.update({name:'b'},{$unset:{sex:' '}})
 
7.删除d兴趣中的一个
db.class.update({name:'d'},{$pop:{hobby:-1}})
 
8.删除a的兴趣,画画,唱歌
db.class.update({name:'a'},{$pullAll:{hobby:['draw','sing']}})
 
9.为c增加一个域,备注:{'民族':‘回族’,'习俗':‘不吃猪肉’}
db.class.update({name:'c'},{$set{'备注':{'民族':'回族','习俗':'不吃猪肉'}}},true)
 
10.在c的备注栏中增加一项,宗教:‘伊斯兰教’
db.class.update({name:'c'},{$set:{'备注.宗教':'伊斯兰教'}})

索引

什么是索引?
索引是建立文档所在位置的查找清单,使用索引可以方便进行快速查找,减少遍历次数,提高查找效率。

索引约束:
1.索引本身也占有数据库空间,所以当数据量很小的时候这种消耗是没有必要的
2.索引表需要根据数据的修改及时修改,否则索引就会不和内容配套,也就失去了意义。
因此如果数据库操作是频繁的修改操作而不是查找操作,则不适合创建索引。

创建索引

db.collection.createIndex( )

eg.:
为name域创建索引
db.class.createIndex({name:1})
id域会由系统自动创建索引,
1表示正向索引,-1表示逆向索引.

查看集合中的索引
db.collection.getIndexes( )

自定义索引名

eg.:
通过(索引选项name),来定义索引名称(为age域创建正向索引,并命名为’AgeIndex’)
db.class.createIndex({age:1},{name:‘AgeIndex’})

其他创建索引的方法

ensureIndex( )
功能: 创建索引
参数: 同createIndex( )

eg.:
创建方法和createIndex用法一致
db.class0.ensureIndex({book:1})

createIndexes( )
功能: 同时创建多个索引
参数: 数组中存入创建索引键值对

eg.:
同时为name,和score两个域创建索引(注意中括号)
db.class0.createIndexes([{name:1},{score:-1}])

删除索引:

db.collection.dropIndex( )
功能: 删除一个索引
参数: 索引名称或者索引键值对

eg.:
通过索引名称删除索引
db.class.dropIndex( )
通过键值对删除索引
db.class.dropIndex({score:-1})

db.collection.dropIndexes( )
功能: 删除集合中所有的索引(不会删除_id索引)

eg.:
删除class中所有的索引
db.class.dropIndexes( )

索引的类型

复合索引:
根据多个域创建一个索引

eg.:
根据name和age域创建复合索引
db.class.createIndex({name:1},{age:-1})

子文档 和 数组索引:
如果对某个域创建索引,该域的值为数组或者子文档,则对数组中的某一项,或者子文档中某个域的查找也是索引查找。

eg.:
对book创建索引后,该查找也为索引查找
db.class2.find({‘book.title’:“围城”})

唯一索引:
要求创建索引的域不能有重复的值

eg.:
对name域创建唯一索引
db.class.createIndex({name:1},{unique:true})

稀疏索引:

eg.:
为name创建稀疏(sparse)索引
db.class.createIndex({name:1},{sparse:true})


聚合操作

对文档进行数据整理和统计。

db.collection.aggregate( )
功能: 完成聚合操作
参数: 聚合条件,需要配合聚合操作符($sum/$avg等)使用

聚合操作符:  $group
分组聚合(往往需要配合一定的统计操作符来完成)

统计求和: $sum

eg.:
按照性别分组,统计结果称为num,方法为求和
db.class0.aggregate({$group:{_id:"$sex", num:{$sum:1}}})
{ “_id” : “W”, “num” : 5 }
{ “_id” : “M”, “num” : 1 }

统计平均数: $avg

eg.:
按性别分组,求平均年龄
db.class0.aggregate({$group:{_id:"$sex",num:{$avg:’$age’}}})
{ “_id” : “W”, “num” : 25 }
{ “_id” : “M”, “num” : 18 }

求最大值: $max

eg.:
按性别分组,求最大年龄
db.class0.aggregate({$group:{_id:"$sex",num:{ $max:’$age’}}})
{ “_id” : “W”, “num” : 29 }
{ “_id” : “M”, “num” : 18 }

求最小值: $min

db.class0.aggregate({$group:{_id:"$sex",num:{$min:'$age'}}})

eg.:
按性别分组,求最小年龄
{ “_id” : “W”, “num” : 17 }
{ “_id” : “M”, “num” : 18 }

$project: 用于格式化的显示文档内容(值的用法同find中的field参数)

eg.:
按照指定名称显示文档内容
db.class0.aggregate({$project: {_id:0, NAME:$‘name’, AGE:$‘age’}})

$match: 筛选数据(值的用法同find中的query参数)

eg.:
筛选出年龄大于19的
db.class0.aggregate({$match:{age:{$gt:19}}})
{ “_id” : 1, “name” : “Hanna”, “age” : 29, “sex” : “W” }
{ “_id” : ObjectId(“5bd180a7426caca061f50ade”), “name” : “Selina”, “age” : 27, “sex” : “w” }
{ “_id” : ObjectId(“5bd7b704feca5c2ddc1438c1”), “name” : “Lucy”, “age” : 21, “sex” : “W” }

猜你喜欢

转载自blog.csdn.net/weixin_42587525/article/details/83552026
今日推荐