mongo之$group+$addToSet
直接举例说明
#ArrangingResult表结构
{
"_id" : ObjectId("5acc739df78bf21f8c94f080"),
"SS_Arranging_Mid" : "5a058cb8705deb4617cde59d",
"Lessons_Status" : 1,
"Lessons" : 9,
"schedule" : [
{
"classname" : "英语3班",
"publicclass" : [
"3班"
],
"subject" : "英语",
"teacher" : "5a055c01105deb3b2fd3bb1e",
"studentlist" : [
"5a055c20335deb3b32d3bbe5",
"5a055c20705de33b32d3bbe6",
"5a055c20705de66b32d3bbeb",
"5a055c20705de44b32d3bbec",
],
},
{
"classname" : "语文4班",
"publicclass" : [
"4班"
],
"subject" : "语文",
"teacher" : "5a055c0b722deb3b2fd3bb16",
"studentlist" : [
"5a055c207077eb3b32d3bbe2",
"5a055c207066eb3b32d3bbe8",
"5a055c20766deb3b32d3bbe9",
"5a055c20705deb3832d3bbea",
],
},
......
查询
pipeline = [
{
"$unwind": "$schedule",
},
{"$match":
{
"SS_Arranging_Mid": arrangeMid,
"Lessons": {"$in": self.lessonsOfQueryDay},
"schedule.studentlist": stuMid,
}
},
{"$project":
{
"_id": 0,
"Lessons": 1,
"teacher": "$schedule.teacher",
"subject": "$schedule.subject",
"classname": "$schedule.classname",
}
}, #==========================================================================
{"$group": {"_id": "$Lessons",
"schedule": {"$addToSet": {"teacher": "$teacher",
"subject": "$subject",
"Lessons": "$Lessons",
"classname": "$classname",
}}}}, #================================================================================
{"$sort": {"_id": 1}}
]
arrangeResults = await ArrangingResult.aggregate(pipeline)
#输出
arrangeResults= [ {'_id': 25, 'schedule': [{'teacher': '5bdfdd577055eb191fcfe21c', 'subject': '语文', 'Lessons': 25, 'classname': '语文一班'}]},_ _ {'_id': 26, 'schedule': [{'teacher': '5bd5557705deb191fcfe21c', 'subject': '语文', 'Lessons': 26, 'classname': '语文一班'}]}, _ _{'_id': 27, 'schedule': [{'teacher': '5bd6bead755deb201206acaf', 'subject': '化学', 'Lessons': 27, 'classname': '化学一班'}]},
#===============================================================================================================================
#此处分组规则设置是让'Lessons': 28的记录分到一组,并且每条的数据都在各自的字典里
{'_id': 28, 'schedule':
[
{'teacher': '5bd6bead555deb201206acb5', 'subject': '音乐', 'Lessons': 28, 'classname': '音乐一班'}, _ _{'teacher': '5bdfdd7f5555deb191dcfe247', 'subject': '数学', 'Lessons': 28, 'classname': '数学一班'}_ _]},_ #================================================================================================================================== _ {'_id': 29, 'schedule': [{'teacher': '5bdfdd7f885deb191dcfe247', 'subject': '数学', 'Lessons': 29, 'classname': '数学一班'}]}, _
如果查询语句换成这种
pipeline = [
{
"$unwind": "$schedule",
},
{"$match":
{
"SS_Arranging_Mid": arrangeMid,
"Lessons": {"$in": self.lessonsOfQueryDay},
"schedule.studentlist": stuMid,
}
},
#$addToSet放在每个单独字段的值里,这样会导致每条数据结果不对应,也就是不能分清那些数据是属于一条的。========================================================
{"$group":
{
"_id": "$Lessons",
"teacher": {"$addToSet": "$schedule.teacher"},
"subject": {"$addToSet": "$schedule.subject"},
"classname": {"$addToSet": "$schedule.classname"}, }
},
#=============================================================================================================================================
{"$sort": {"_id": 1}}
] #结果
_{'_id': 27, 'teacher': ['5bd6bead70511b201206acaf'], 'subject': ['化学'], 'classname': ['化学一班'],},
#========================================================================================================================================== {'_id': 28, 'teacher': ['5bdfdd7f705de1191dcfe247', '5bd6bead705deb201206acb5'], 'subject': ['数学', '音乐'], 'classname': ['数学一班', '音乐一班']]}]
#=================================================================================================================================================
mongo之$group+$addToSet的更多相关文章
- mongo 修改器 $inc/$set/$unset/$pop/$push/$pull/$addToSet
mongo $inc 可以对集合里面的某些值是数字的增减.看代码 $set 可以进行修改,并且不存在的时候默认添加. 同时还能该变数据的类型. 还可以该变内嵌元素的值 用.调用 $unset 删除 ...
- mongo group by
mongo的写法与mysql等sql有着天壤之别,如最近在统计爬虫抓取的数据,其中一个就是按字段从大到小取前十个: sql写法:select count(id) from invest group b ...
- mongo数组修改器—$push、$ne、$addtoset、$pop、$pull
这几个方法也很有意思 $push 像已有的数组末尾加入一个元素,要是元素不存在,就会创建一个新的元素,如果元素存在了,就会再添加一个一模一样的元素,会造成元素的重复,所以在使用的时候,要确保该元素不存 ...
- segmentfault.com mongo出识以及对数组的操作
https://segmentfault.com/a/1190000003951602 首先推荐个工具,no-sql-manager-for-mongodb-professional,虽然收费,但是每 ...
- mongo复习
$pop:-1移除数组的第一个元素,1移除最后一个元素eg: db.c.update({"name" : "toyota"},{$pop:{"titl ...
- Mongo中的数组操作
当前mongo中有这么一条数据 book是一个数组,在他后面添加一条数据 { "_id" : ObjectId("5721f504d1f70435632b5ce7&quo ...
- mongo 学习教程(全)
看的是爱酷学习网的视频:http://www.icoolxue.com/album/show/98 01 安装 1.先建mongoDB-data文件夹存数据 2.安装DB 3.设置环境变量:把bin目 ...
- mongo 学习笔记
mysql语句 : ' ,,),(,,) mongo语句: db.}}).limit() db."}) db.}}) 条件操作符1 mongodb中的条件操作符有: (>) 大于 ...
- 二、mongo数据库
官网:https://www.mongodb.com/ 进入官网 右上角有个下载按钮Download 1.完成安装后:运行--cmd(命令面板) 2.常用命令: 打开数据库 mongod –dbpat ...
随机推荐
- 跨域篇--JSONP原理
一篇文章让你明白 jsonp原理详解 什么是JSONP? 先说说JSONP是怎么产生的: 其实网上关于JSONP的讲解有很多,但却千篇一律,而且云里雾里,对于很多刚接触的人来讲理解起来有些困难,着用自 ...
- mybatis自学历程(二)
传递多个参数 1.在mybatis.xml下<mappers>下使用<package> <mappers> <package name="com.m ...
- Data structure alignment by binary operation
在寫C的過程中,我們會很自然地以為,我連續宣告一堆大小不一的char array. 經過Complier之後這些char array未必是連續擺放.至於為什麼就要談到我們今天的主角了alignment ...
- FZU 2079 最大获利(线段树+DP)
Description Sean准备投资一些项目.有n个投资项目,投资第i个项目需要花费Ci元.Sean发现如果投资了某些编号连续的项目就能赚得一定的钱.现在给出m组连续的项目和每组能赚得的钱,请问采 ...
- NFS挂载error:reason given by server: Permission denied
首先你得看看你的NFS服务有没有启动 然后你看看你要mount的文件夹有没有在NFS主机共享 然后再看权限对没对
- 学习笔记-es5新增的一些数组的API(不全)-字符串-字符串API(不全)
### es5新增的数组的api + indexOf() 搜索数组中的元素,并返回它所在的位置. arr.indexOf(str,index) 参数: str为要查找的字符串 index为开始查找的下 ...
- 【转载】vue install报错run `npm audit fix` to fix them, or `npm audit` for details html
原链接https://www.jianshu.com/p/60591cfc6952 执行npm install 出现如下提醒 added 253 packages from 162 contribut ...
- JAVA企业级应用服务器之TOMCAT实战
JAVA企业级应用服务器之TOMCAT实战 链接:https://pan.baidu.com/s/1c6pZjLeMQqc9t-OXvUM66w 提取码:uwak 复制这段内容后打开百度网盘手机App ...
- MySQL关闭查询缓存(QC)的两种方法
MySQL Query Cache 会缓存select 查询,安装时默认是开启的,但是如果对表进行INSERT, UPDATE, DELETE, TRUNCATE, ALTER TABLE, DROP ...
- spring security学习总结
这几天一直在学习spring security的相关知识.逛各大论坛,看相关api与教学视频,获益良多! 简介 Spring Security是为基于Spring的企业应用系统提供声明式的安全访问控制 ...