准备数据

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

MongoDB分组查询,聚合查询,以及复杂查询相关推荐

  1. Elasticsearch Java API 分组、聚合、嵌套相关查询

    Elasticsearch Java API 分组.聚合.嵌套相关查询 翼支付监控系统正使用es做后端存储,这边我们是将日志计算处理过后的数据通过kafka储存到es.选择用es作为数据储存端是考虑到 ...

  2. MongoDB中的聚合管道($lookup多表关联查询、$unwind、$match、$project)

    MongoDB中的聚合管道($lookup多表关联查询.$unwind.$match.$project) 管道的概念 聚合框架 $lookup的功能及语法 主要功能 基本语法 例子 说明 $unwin ...

  3. java操作es聚合操作并显示其他字段_java使用elasticsearch分组进行聚合查询过程解析...

    这篇文章主要介绍了java使用elasticsearch分组进行聚合查询过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 java连接elas ...

  4. 数据库MySQL基础---约束、表关系、聚合函数、连接查询、分组查询和子查询

    约束 1.主键约束亦成为主码,关键字:primary key,设置了主键约束的列的数据要求:不能为空,不允许重复. 2.自增长策略针对主键,不需要手动给值,自动的值是当前表中该列最大值+1关键字:au ...

  5. mysql 连边聚合_MySQL分组,聚合函数,连表查询,子查询

    >>>分组: group by + group_concat 分组:类似于将一个班级的学生,按照性别或其他条件,分成若干个组,最终以小组为单位显示,如上图中,以post字段对表进行分 ...

  6. Django 【第六篇】ORM跨表操作(聚合查询,分组查询,F和Q查询等)

    一:创建表 书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-many);     一本书只应该由一个出版商出 ...

  7. 2019-7-27 [MySQL] DQL 简单查询[别名/去重/运算] 条件查询 排序查询 聚合查询 分组查询 导出与导入 多表操作[一对多/多对多][创外键 创联合主键 约束 添加 删除 测试]

    文章目录 5 SQL语句(DQL) 5.1DQL准备工作和语法 5.1.1准备工作 5.1.2 DQL语法: 5.2 简单查询 5.2.1 查询所有的商品 5.2.2 查询商品名和商品价格. 5.2. ...

  8. Elasticsearch教程(4) High Level REST Client API 查询 聚合 分组

    ES High Level REST Client API 查询 聚合 1 准备数据 1.1 插入测试数据 2 Maven引入ES 3 创建Client 4 查询API 4.1 根据id查询单条数据 ...

  9. SQL干货丨关于分组和聚合函数,如何实现查询排名?!

    一. 需求分析 我们在学习数据库查询时,经常会遇到关于分组和聚合函数的查询,比如查询每门课程的最高分,每位同学的平均分,其实这些都是比较一般的问题.但如果遇到查询每门课程成绩的前几名问题,就会变的很棘 ...

最新文章

  1. 14岁初中生3天制成勒索病毒 制作方法或自学而成
  2. TRIZ发明问题解决理论——本质是分析问题中的矛盾,利用资源(时间空间物质能量功能信息等)来解决矛盾从而解决问题——抽象出来:问题是什么,为什么?...
  3. 为什么很多大老板银行贷款几千万,看起来还那么潇洒?
  4. 前端vue适配不同的分辨率_前端面试时,被问到项目中的难点有哪些?
  5. java jdk 的环境变量_Java JDK14(Java 14)在Windows上安装与环境变量配置
  6. 口罩日产量破1亿背后:近3000家企业疯狂增产转产
  7. 虚拟机linux搭建samba,搭建samba服务使在windows上使用虚拟机为linux
  8. Spring MVC拦截器实现用户登录权限验证案例
  9. 取得浏览器当前鼠标的X,Y坐标的JavaScript脚本及document元素的一些重要属性
  10. java url dns_JAVA反序列化-ysoserial-URLDNS
  11. 中国新材料产业应用前景与十四五运营方向分析报告2021年版
  12. Alexa工具条正确安装方法 Alexa工具条正确使用方法 Alexa工具条正确应用
  13. STM32外设驱动库分析与实现
  14. Centos服务器巡检报告
  15. 服务器怎么建立无线局域网,家庭无线局域网的组建教程
  16. 阿里云对象存储以及api
  17. 教你如何一键重装Windows7系统
  18. Android 注解Annotation及在流行框架中使用的原理
  19. 【JAVASCRIPT】正则表达式用于定义
  20. 用DIV+CSS技术设计的鲜花网站(web前端网页制作课作业)

热门文章

  1. CurvLearn开源 | 阿里妈妈曲率学习框架详解
  2. HTTP概念详解与案例测试
  3. PAT_B_1012_Java(20分)
  4. eclipse打包jar发布到linux下运行出错(java.lang.ClassNotFoundException: cmd.WordCount$MyMapper )
  5. 【Ubuntu-opencv3.4.0-Error】对‘cv::Mat::updateContinuityFlag()’未定义的引用
  6. python运行报错
  7. facebook 图像比赛_使用Facebook的Detectron进行图像标签
  8. 经常收到信用卡邀请短信,但为什么总是办不下来?
  9. 这些贷款合同陷阱你知道多少?
  10. “80后”作家应扮演更重要的角色