直接举例说明

#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. ArcGis 创建Annotation注记要素类、添加注记要素 并加载到Activeview AO C#

    AO中一般有两种方式存储图面注记元素,一种使用TextElement,它是文档级的元素,编辑后要通过文档(mxd)保存:另一种是使用Annotation要素类,它是一个独立的要素类(featurecl ...

  2. python之数据序列转换并同时计算数据

    问题 你需要在数据序列上执行聚集函数(比如 sum() , min() , max() ), 但是首先你需要先转换或者过滤数据 解决方案 一个非常优雅的方式去结合数据计算与转换就是使用一个生成器表达式 ...

  3. Chrome不支持css字体小于12px的解决办法

    我们先来看个效果图(chrome下): 从上面的图可以很明显地看出Chrome下css设置字体大小为12px及以下时,显示的都是一样大小,都是默认12px: 那么网上有一个方法就是给当前样式添加Chr ...

  4. LeetCode Array Easy 26.Remove Duplicates from Sorted Array 解答及疑惑

    Description Given a sorted array nums, remove the duplicates in-place such that each element appear ...

  5. windows xp .net framework 4.0 HttpWebRequest 报The underlying connection was closed,基础连接已关闭

    windows xp .net framework 4.0 HttpWebRequest 报The underlying connection was closed,基础连接已关闭,错误的解决方法 在 ...

  6. Mysql中(@i:=@i+1)的作用

    Oracle中有一个伪列rownum,可以在生成查询结果表的时候生成一组递增的序列号.MySQL中没有这个伪列,但是有时候要用,可以用如下方法模拟生成一列自增序号. (1)sql示例:select ( ...

  7. 【记录】原生js日期格式化转换方法

    情况一:将日期转换为指定的格式:比如转换成 年月日时分秒 首先我们在js中定义函数如下 Date.prototype.format = function(fmt) { var o = { " ...

  8. pickle模块 和json模块

    pickle和json序列号 json模块是所有语言通用的,可以用来把一些数据转成字符串存储在文件中 import json l=[,,] with open('t3',mode='w',encodi ...

  9. 二进制搭建一个完整的K8S集群部署文档

    服务器规划 角色 IP 组件 k8s-master1 192.168.31.63 kube-apiserver kube-controller-manager kube-scheduler etcd ...

  10. FromBase64String(String)和Encoding.Default.GetBytes(String)

    今天突然被问FromBase64String(String)和Encoding.Default.GetBytes(String)有啥区别,我刚开始学C#对这个一脸懵逼,于是总结一下今天查资料的内容. ...