首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MongoDB数据库(二)

MongoDB数据库(二)

作者头像
不断折腾
发布2019-09-23 11:11:42
1.4K0
发布2019-09-23 11:11:42
举报
聚合(aggregate)

简单来说就是将上一次处理的结果交给下一个处理,最后一个处理完输出

我们将每一次的处理叫做管道。

常用管道有:

$group:分组,用于统计结果

$match:用于过滤数据

$project:修改结构,重命名,增加,删除字段,创建计算结果等

$sort:排序

$limit:显示的文档数(显示几行数据)

$skip:跳过前多少数量的文档

$unwind:将数据类型字段拆分

常用表达式

$sum:求和

$avg:平均值

$min:获取最小值

$max:获取最大值

$push:插入一个数组

$first:获取第一个文档数据

$last:获取最后一个文档数据

实例:

# 数据还是上一篇的stu中的数据

# 按照性别分组,并计算有多少人

db.stu.aggregate(

{$group:{_id:"$sex",count:{$sum:1}}}

)

输出:

{ "_id" : "女", "count" : 3 }

{ "_id" : "男", "count" : 3 }

# _id是指定用什么字段分组,需要写成$sex, $sum:1表示此行数据计算为1

# 在上面的基础上计算不同性别的平均值

db.stu.aggregate(

{$group:{_id:"$sex",count:{$sum:1},svg_age:{$avg:'$age'}}}

)

输出:

{ "_id" : "女", "count" : 3, "agv_age" : 22.666666666666668 }

{ "_id" : "男", "count" : 3, "agv_age" : 19.333333333333332 }

# 不进行分组,求所有人的数量和年龄平均值

db.stu.aggregate(

{$group:{_id:null,count:{$sum:1},svg_age:{$avg:'$age'}}}

)

# 在按照性别分组,并计算有多少人,计算不同性别的平均值只取count值

# 并且对count进行重命名为sum,不现实其他

db.stu.aggregate(

{$group:{_id:'$sex',count:{$sum:1},agv_age:{$avg:'$age'}}},

{$project:{sum:'$count',_id:0}}

)

# _id会默认显示,需要需要给个0,其他不写则不显示。

输出:

{ "sum" : 3 }

{ "sum" : 3 }

# 在上述例子中过滤sum大于2的

db.stu.aggregate(

{$group:{_id:'$sex',count:{$sum:1},agv_age:{$avg:'$age'}}},

{$project:{sum:'$count',_id:0}}

{$match:{sum:{$gt:2}}}

)

# 排序

# 按照年龄升序,降序就是-1

db.stu.aggregate(

{$sort:{age:1}}

)

# $limit和$skip

# 查询两条消息

db.stu.aggregate(

{$limit:2}

)

# 跳过前两条,显示两条

db.stu.aggregate(

{$skip:2}

{$limit:2}

)

# $unwind

# 对数组拆分

例如插入一条数据

db.test1.insert({_id:1,size:[111,222,333]})

# 拆分

db.test1.aggregate(

{$unwind:'$size'}

)

会输出:

{"_id":1,"size":111}

{"_id":1,"size":222}

{"_id":1,"size":333}

索引

# 插入1000条数据,在MongoDB中可以执行js脚本的

# 你可以插入更多的数据看到更好的效果

for(i=0;i<1000;i++){db.test.insert({name:"test"+i,age:i})}

# 查询一条数据

db.test.find({name:'test888'})

# 查看查询的时间

db.test.find({name:'test888'}).explain('executionStats')

找到executionTimeMillis,后面就是查询的时间单位是毫秒

# 建立索引

db.test.ensureIndex({name:1})

# 再次执行

db.test.find({name:'test888'}).explain('executionStats')

查看时间,对比没有建立索引时候的时间,差距是很大的。

# 查看当前集合的索引

db.test.getIndexes()

# 删除索引

db.test.dropIndex()

例如:db.test.dropIndex({name:1})

# 建立索引如果不想有重复的值可以指定唯一性

# 爬虫去重复可以利用

db.test.ensureIndex({name:1},{'unique':true})

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-01-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 python入门到放弃 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 MongoDB
腾讯云数据库 MongoDB(TencentDB for MongoDB)是腾讯云基于全球广受欢迎的 MongoDB 打造的高性能 NoSQL 数据库,100%完全兼容 MongoDB 协议,支持跨文档事务,提供稳定丰富的监控管理,弹性可扩展、自动容灾,适用于文档型数据库场景,您无需自建灾备体系及控制管理系统。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档