MongoDB分组查询,聚合查询,以及复杂查询

准备数据

from pymongo import MongoClient
import datetimeclient=MongoClient('mongodb://localhost:27017')
table=client['db1']['emp']l=[
('张飞','male',18,'20170301','',7300.33,401,1), #以下是教学部
('张云','male',78,'20150302','teacher',1000000.31,401,1),
('刘备','male',81,'20130305','teacher',8300,401,1),
('关羽','male',73,'20140701','teacher',3500,401,1),
('曹操','male',28,'20121101','teacher',2100,401,1),
('诸葛亮','female',18,'20110211','teacher',9000,401,1),
('周瑜','male',18,'19000301','teacher',30000,401,1),
('司马懿','male',48,'20101111','teacher',10000,401,1),('袁绍','female',48,'20150311','sale',3000.13,402,2),#以下是销售部门
('张全蛋','female',38,'20101101','sale',2000.35,402,2),
('鹌鹑蛋','female',18,'20110312','sale',1000.37,402,2),
('王尼玛','female',18,'20160513','sale',3000.29,402,2),
('我尼玛','female',28,'20170127','sale',4000.33,402,2),('杨过','male',28,'20160311','operation',10000.13,403,3), #以下是运营部门
('小龙女','male',18,'19970312','operation',20000,403,3),
('郭靖','female',18,'20130311','operation',19000,403,3),
('黄蓉','male',18,'20150411','operation',18000,403,3),
('梅超风','female',18,'20140512','operation',17000,403,3)
]for n,item in enumerate(l):d={"_id":n,'name':item[0],'sex':item[1],'age':item[2],'hire_date':datetime.datetime.strptime(item[3],'%Y%m%d'),'post':item[4],'salary':item[5]}table.save(d)# 准备数据

分组的概念与mysql相同,以某个字段作为依据进行归类,其目的是为了统计

$match

#match 用于对数据进行筛选
{"$match":{"字段":"条件"}},可以使用任何常用查询操作符$gt,$lt,$in等#例1、select * from db1.emp where post='teacher';
db.emp.aggregate({"$match":{"post":"teacher"}})#例2、select * from db1.emp where id > 3;  
db.emp.aggregate({"$match":{"_id":{"$gt":3}}},
)

$project

# project翻译为投射 ,即将一个数据结果映射为另一个结果 过程中可以对某些数据进行修改  控制其最终显示的结果
{"$project":{"要保留的字段名":1,"要去掉的字段名":0,"新增的字段名":"表达式"}}#1、select name,post,(age+1) as new_age from db1.emp;
db.emp.aggregate({"$project":{"name":1,"post":1}})#2、表达式之数学表达式
{"$add":[expr1,expr2,...,exprN]} #相加
{"$subtract":[expr1,expr2]} #第一个减第二个
{"$multiply":[expr1,expr2,...,exprN]} #相乘
{"$divide":[expr1,expr2]} #第一个表达式除以第二个表达式的商作为结果
{"$mod":[expr1,expr2]} #第一个表达式除以第二个表达式得到的余数作为结果
#例:所有人年龄加1显示
db.emp.aggregate({"$project":{"name":1,"post":1,"new_age":{"$add":["$age",1]}}})
# 错误示范: 原因:参加运算的字段不能被影藏
db.emp.aggregate({"$project":{"name":1,"salary":1,"age":0,"new_age":{"$add":["$age",1]}}})#3、表达式之日期表达式:$year,$month,$week,$dayOfMonth,$dayOfWeek,$dayOfYear,$hour,$minute,$second
#例如:select name,date_format("%Y") as hire_year from db1.emp
db.emp.aggregate({"$project":{"name":1,"hire_year":{"$year":"$hire_date"}}}
)#例如查看每个员工的工作多长时间
db.emp.aggregate({"$project":{"name":1,"hire_period":{"$subtract":[{"$year":new Date()},{"$year":"$hire_date"}]}}}
)#4、字符串表达式
{"$substr":[字符串/$值为字符串的字段名,起始位置,截取几个字节]}
{"$concat":[expr1,expr2,...,exprN]} #指定的表达式或字符串连接在一起返回,只支持字符串拼接
{"$toLower":expr}
{"$toUpper":expr}db.emp.aggregate( {"$project":{"NAME":{"$toUpper":"$name"}}})#5、逻辑表达式
$and
$or
$not
其他见Mongodb权威指南

$group

# $group用于分组
# 分组后具体信息被影藏 
db.emp.aggregate({"$match":{"_id":{"$gt":3}}},{"$group":{"_id":"$post"}}  
)# 通常我们要对分组后的内容进行统计这就需要对应的几个聚合函数# select id,avg(salary) from db1.emp where id > 3 group by post;  
db.emp.aggregate({"$match":{"_id":{"$gt":3}}},{"$group":{"_id":"$post",'avg_salary':{"$avg":"$salary"}}},
)
# math用于匹配 与mysql不同的是没有顺序限制 每一个操作像是一个管道接收上一个的数据进行处理再传给下一个# select id,avg(salary) from db1.emp where id > 3 group by post having avg(salary) > 10000;  
db.emp.aggregate({"$match":{"_id":{"$gt":3}}},{"$group":{"_id":"$post",'avg_salary':{"$avg":"$salary"}}},{"$match":{"avg_salary":{"$gt":10000}}}
)# 对应的聚合函数 $sum、$avg、$max、$min、$first、$last#1、将分组字段传给$group函数的_id字段即可
{"$group":{"_id":"$sex"}} #按照性别分组
{"$group":{"_id":"$post"}} #按照职位分组
{"$group":{"_id":{"state":"$state","city":"$city"}}} #按照多个字段分组,比如按照州市分组#2、分组后聚合得结果,类似于sql中聚合函数的聚合操作符:$sum、$avg、$max、$min、$first、$last
#例1:select post,max(salary) from db1.emp group by post; 
db.emp.aggregate({"$group":{"_id":"$post","max_salary":{"$max":"$salary"}}})#例2:去每个部门最大薪资与最低薪资
db.emp.aggregate({"$group":{"_id":"$post","max_salary":{"$max":"$salary"},"min_salary":{"$min":"$salary"}}})#例3:如果字段是排序后的,那么$first,$last会很有用,比用$max和$min效率高
db.emp.aggregate({"$group":{"_id":"$post","first_id":{"$first":"$_id"}}})#例4:求每个部门的总工资
db.emp.aggregate({"$group":{"_id":"$post","count":{"$sum":"$salary"}}})#例5:求每个部门的人数
db.emp.aggregate({"$group":{"_id":"$post","count":{"$sum":1}}})#3、数组操作符
{"$addToSet":expr}:不重复
{"$push":expr}:重复
# 等同于group_concat
#例:查询岗位名以及各岗位内的员工姓名:select post,group_concat(name) from db1.emp group by post;
db.emp.aggregate({"$group":{"_id":"$post","names":{"$push":"$name"}}})
db.emp.aggregate({"$group":{"_id":"$post","names":{"$addToSet":"$name"}}})

$sort ,limit,skip

{"$sort":{"字段名":1,"字段名":-1}} #1升序,-1降序
{"$limit":n} 
{"$skip":n} #跳过多少个文档
#例1、取平均工资最高的前两个部门db.emp.aggregate(
{"$group":{"_id":"$post","平均工资":{"$avg":"$salary"}}
},
{"$sort":{"平均工资":-1}
},
{"$limit":2
}
)
#例2、
db.emp.aggregate(
{"$group":{"_id":"$post","平均工资":{"$avg":"$salary"}}
},
{"$sort":{"平均工资":-1}
},
{"$limit":2
},
{"$skip":1
}
)
排序:$sort、限制:$limit、跳过:$skip

$sample

# 随机取出n条记录
#集合users包含的文档如下
{ "_id" : 1, "name" : "dave123", "q1" : true, "q2" : true }
{ "_id" : 2, "name" : "dave2", "q1" : false, "q2" : false  }
{ "_id" : 3, "name" : "ahn", "q1" : true, "q2" : true  }
{ "_id" : 4, "name" : "li", "q1" : true, "q2" : false  }
{ "_id" : 5, "name" : "annT", "q1" : false, "q2" : true  }
{ "_id" : 6, "name" : "li", "q1" : true, "q2" : true  }
{ "_id" : 7, "name" : "ty", "q1" : false, "q2" : true  }#下述操作时从users集合中随机选取3个文档
db.users.aggregate({"$sample":{"size":3}})
随机选取n个:$sample

可视化工具

https://robomongo.org

转载于:https://www.cnblogs.com/liu--huan/p/10721266.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/248125.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python学习(三)基础

一、函数与模块 定义函数: 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()。任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。函数内容以…

操作系统原理之I/O设备管理(第六章上半部分)

一、I/O系统的组成 I/O系统不仅包括各种I/O设备,还包括与设备相连的设备控制器,有些系统还配备了专⻔⽤ 于输⼊/输出控制的专⽤计算机,即通道。此外,I/O系统要通过总线与CPU、内存相连。 I/O系统的结构: I/O设备的分类…

js控制a标签点击事件 触发下载

问题背景,动态获取data把url赋值到a标签的url中,让a标签自动下载 首先想到的应该是$(xxx).click(), 查资料明白:js中的$(...).click()事件只能触发绑定的onClick方法,不能跳转到href。 第二种方法:获取到url之后locat…

操作系统原理之I/O设备管理(第六章下半部分)

五、I/O软件原理 输入输出软件的总体目标是将软件组织成一种层次结构 低层软件用来屏蔽硬件的具体细节高层软件则主要是为用户提供一个简洁、规范的界面设备管理的4个层次: 用户层软件 -》向系统发出I/O请求,显示I/O操作的结果,提供⽤户与设备…

jQuery第二天

课程回顾: ​ jQuery:JavaScript库 ​ 入口函数:$(function () {}); ​ jQuery:jQuery对象,DOM对象 ​ jQuery转成DOM:$(‘元素’)[索引值] ​ DOM转成jQuery:$(DOM对象); ​ 筛选方法&am…

切换Debug/Release编译模式和Archive的作用

在学这个之前,以为很难,也起不到什么作用,但是等真正运用到工程里面,才发现,这个能帮你省下很多工作量。 1,Debug和Release版本区别? 进行iOS开发,在Xcode调试程序时&am…

Linux 防火墙:Netfilter iptables

一、Netfilter 简介 (1) Netfilter 是 Linux 内置的一种防火墙机制,我们一般也称之为数据包过滤机制,而 iptables 只是操作 netfilter 的一个命令行工具(2) Netfilter 是 Linux CentOS 6 内置的防火墙机制,Firewall 是 Linux CentOS 7 内置的…

无法加载 DLL“SQLite.Interop.DLL”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)。...

无法加载 DLL“SQLite.Interop.DLL”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)。 在项目里添加 现有项 把SQLite.Interop.DLL文件添加进来,然后点击属性 修改一个属性 把 属性 复制到输出目录 改为 始终复制 然后打开你的项目属性 进入生成的 页面&a…

jQuery第三天

课程回顾: ​ 动画效果:基本动画,滑动动画,淡入淡出,自定义动画效果(animate) ​ 事件切换:hover(over,out); ​ 停止动画:stop ​ 操作属性:prop(固有属…

C语言程序设计II—第八周教学

第八周教学总结(15/4-21/4) 教学内容 本周的教学内容为:   8.4 电码加密 知识点:指针与字符串,重难点:字符指针与字符串的关联和区别;   8.5 任意个整数求和 知识点:动态内存分配…

AFNetworking 对数据进行https ssl加密

参考来源:http://www.cnblogs.com/jys509/p/5001566.html 现在在工作中的工作需求:https请求验证证书一般来讲如果app用了web service , 我们需要防止数据嗅探来保证数据安全.通常的做法是用ssl来连接以防止数据抓包和嗅探其实这么做的话还是不够的 。…

数据库系统原理(第一章概述)

一、数据库基本概念 什么是数据:数据(Data)是描述事物的符号记录,是指利用物理符号记录下来的、 可以鉴别的信息。 数据是信息存在的一种形式,只有通过解释或处理的数据才能成为有用的信息。 什么是数据库:…

jQuery第四天

课程回顾: ​ 元素操作: ​ 遍历元素: ​ $(‘元素’).each(function (index, elm) {}); ​ $.each(对象,function (index, elm) {}); ​ 创建元素:$(‘ 新的元素?’);​ 添加元素: ​ 内部添加&…

navigationController的NavigationBar和ToolBar的POP或PUSH消失问题

今天在工作中发现一个坑, 其他页面都是隐藏。YSViewController 使用的时候必须是需要 navigationBar 和 toorbar,但是 pop出这个viewcontroller后,需要隐藏navigationBar 和 toorbar,但是直接设置为hiddenYES会出现其他页面压栈出…

实验二:Linux下Xen环境的安装

实验名称: Linux下Xen环境的安装(centOS7) 实验环境: 本次实验基本是在centOS7的环境下完成,系统内核和系统版本如下: 实验要求: 为centOS7的环境下安装Xen的平台,能够正常使用Xen下…

IDEA写vue项目出现红色波浪线警告如何解决??

1.看图 2.希望对大家有帮助,只要修改了这个就可以,如有任何问题都可以留言,谢谢大家 2019-09-1923:54:11 作者:何秀好 转载于:https://www.cnblogs.com/itboxue/p/11553395.html

数据可视化(BI报表的开发)第一天

课程回顾: ​ jQuery事件注册: ​ $(元素).click(function () {}); ​ $(元素).on(‘click’, [后代元素], function () {}); ​ $(元素).one(‘click’, function () {}); ​ 解绑事件:off ​ 自动触发: ​ $(元素).click…

在Block中使用weakSelf与strongSelf的意义

在Block中使用weakSelf与strongSelf的意义 我们都会声明一个弱引用在block中使用, 目的就是防止循环引用, 那么weakSelf与strongSelf一起使用目的是什么呢? 首先先定义2个宏: #define YXWeakSelf(type) __weak typeof(type) weak##type type; #define StrongSelf(type) __…

操作系统原理之操作系统简介(第一章)

一、 什么是操作系统 操作系统:是一种复杂的系统软件,是不同程序代码、数据结构、数据初始化文件的集合,可执行。 操作系统是用户与硬件之间的接口:操作系统与硬件部分相互作用,并且为运行在计算机上的应用程序提供执行…

数据可视化(BI报表的开发)第二天

9、公用面板样式 所有的面板的基础样式是一致的,提前布局好。 面板 .panel :box-sizing,边框图,大小,定位【51 38 20 132】容器 .inner:padding:24,36,定位外部拉宽标…