直接举例说明

#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的更多相关文章

  1. mongo 修改器 $inc/$set/$unset/$pop/$push/$pull/$addToSet

    mongo $inc 可以对集合里面的某些值是数字的增减.看代码 $set  可以进行修改,并且不存在的时候默认添加. 同时还能该变数据的类型. 还可以该变内嵌元素的值 用.调用 $unset  删除 ...

  2. mongo group by

    mongo的写法与mysql等sql有着天壤之别,如最近在统计爬虫抓取的数据,其中一个就是按字段从大到小取前十个: sql写法:select count(id) from invest group b ...

  3. mongo数组修改器—$push、$ne、$addtoset、$pop、$pull

    这几个方法也很有意思 $push 像已有的数组末尾加入一个元素,要是元素不存在,就会创建一个新的元素,如果元素存在了,就会再添加一个一模一样的元素,会造成元素的重复,所以在使用的时候,要确保该元素不存 ...

  4. segmentfault.com mongo出识以及对数组的操作

    https://segmentfault.com/a/1190000003951602 首先推荐个工具,no-sql-manager-for-mongodb-professional,虽然收费,但是每 ...

  5. mongo复习

    $pop:-1移除数组的第一个元素,1移除最后一个元素eg: db.c.update({"name" : "toyota"},{$pop:{"titl ...

  6. Mongo中的数组操作

    当前mongo中有这么一条数据 book是一个数组,在他后面添加一条数据 { "_id" : ObjectId("5721f504d1f70435632b5ce7&quo ...

  7. mongo 学习教程(全)

    看的是爱酷学习网的视频:http://www.icoolxue.com/album/show/98 01 安装 1.先建mongoDB-data文件夹存数据 2.安装DB 3.设置环境变量:把bin目 ...

  8. mongo 学习笔记

    mysql语句 : ' ,,),(,,)   mongo语句: db.}}).limit() db."}) db.}}) 条件操作符1 mongodb中的条件操作符有: (>) 大于 ...

  9. 二、mongo数据库

    官网:https://www.mongodb.com/ 进入官网 右上角有个下载按钮Download 1.完成安装后:运行--cmd(命令面板) 2.常用命令: 打开数据库 mongod –dbpat ...

随机推荐

  1. Findwind() Enumwindow()

    1. FindWindow() HWND FindWindow(LPCSTR lpClassName, LPCSTR lpWindowName); 功能:查找与指定窗口类名和窗口名称相匹配的顶级窗口, ...

  2. Linux NIO 系列(04-2) poll

    目录 一.select 和 poll 比较 二.poll API 附1:linux 每个进程IO限制 附2:poll 网络编程 Linux NIO 系列(04-2) poll Netty 系列目录(h ...

  3. 在mac版virtual box中安装ubuntu虚拟机的NAT/Host-Only网络配置踩坑记录

    之前用惯了vmware和parallels desktop,网络配置十分智能,基本不用自己配置.由于版权原因,工作电脑上换了免费的virtual box用,四五年都完全在虚拟机里干活的本菜鸡居然在虚拟 ...

  4. HttpClient 之Fluent API 简单使用

    相比于HttpClient 之前的版本,HttpClient 4.2 提供了一组基于流接口(fluent interface)概念的更易使用的API,即Fluent API. 为了方便使用,Fluen ...

  5. js canvas 粒子动画 电子表

     前言 从我接触canvas的第一天就觉得canvas很有趣,想搞点事情,这几天终于忍不住了,于是他来了. 先看效果                       这里我做了四个大家有兴趣可以看完文章, ...

  6. idea maven springmvc mybabit 多模块管理整合

    一.安装软件jdk1.7,tomcat7.0,idea,mysql,maven 二.在idea中配置jdk 1.依次点开File -->Project Structure,点击左侧标签页,点击S ...

  7. JS对象 window对象 屏幕可用高和宽度 1. screen.availWidth 属性返回访问者屏幕的宽度,以像素计,减去界面特性,比如任务栏。 2. screen.availHeight 属

    屏幕可用高和宽度 1. screen.availWidth 属性返回访问者屏幕的宽度,以像素计,减去界面特性,比如任务栏. 2. screen.availHeight 属性返回访问者屏幕的高度,以像素 ...

  8. Linux 登录、注销与关机

    Linux 登录.注销与关机 这里主要学习的是命令行环境下的相关操作. 一.登录 Linux 默认的情况下会提供六个终端来让用户登录,切换的方式为使用:[Ctrl + Alt + F1 ~ F6]的组 ...

  9. 2016计蒜之道复赛 百度地图的实时路况 分治+Floyd

    题目链接:https://nanti.jisuanke.com/t/A1108 这道题还挺有意思的.让我对Floyd的了解又加深了一点. 首先我们重新审视Floyd这三重循环到底有什么用?第一层是枚举 ...

  10. ansible如何用root用户运行普通用户授权

    ansible默认以root用户进行授权,但是需要用普通用户执行一些命令操作: 如: 1. ansible 10.0.0.1 -m raw -a "date" -u www 但是会 ...