直接举例说明

#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. 论一个PHP项目上线的注意点

    一.后端问题 服务器配置要跟上流量 预估QPS时要给足未知流量的空间 后端数据库设计要根据项目大小来相对应,小型流量单表就可以,但是中大型要分库分表 在处理执行修改的操作时一定要多一层判断(判断是否已 ...

  2. 关于 AfxGetStaticModuleState ()

    写MFC的DLL的时候,总会在自动生成的代码框架里看到提示,需要在每一个输出的函数开始添加上AFX_MANAGE_STATE (AfxGetStaticModuleState()).一直不明白这样做的 ...

  3. NOI 2018 Day1 T1 归程

    题面见洛谷 难点:  走过有积水的地方之后就需计算路径长了 关键算法:   kruskal重构树 ①原来的 kruskalkruskalkruskal 算法就是用并查集实现的, 但当我们使用 krus ...

  4. python_ 模块 json pickle shelve

    一,什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编写的代码( ...

  5. 关于shell脚本中的别名问题

    在shell脚本中,shell中的alias别名是不会起作用的,在脚本中的命令都是按着环境变量PATH直接找到命令文件而执行的,所以就不用担心脚本里的命令会与shell中的个性别名冲突啦~

  6. Vue.js文档学习

    Vue细碎小点 生命周期钩子:created().mounted().updated().destroyed() 不要在选项属性或回调上使用箭头函数,比如 created: () => cons ...

  7. 从零开始搭建系统2.8——HDFS安装及配置

    从零开始搭建系统2.8——HDFS安装及配置

  8. vue element-ui NavMenu错位问题

    原因:子菜单全部打开后太长超过100% 解决方法:设置只能点击打开当前的菜单

  9. loadrunner自定义函数

    https://zhangfy068.iteye.com/blog/1614794 Loadruner 有四种实现自定义函数的方式,根据脚本编写方便性进行选择不同的方式. (1)直接引用法: Acti ...

  10. PHP ftp_exec() 函数

    定义和用法 ftp_exec() 函数请求在 FTP 服务器上执行一个程序或命令. 如果成功,该函数返回 TRUE.如果失败,则返回 FALSE. 语法 ftp_exec(ftp_connection ...