直接举例说明
#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': ['数学一班', '音乐一班']]}] #=================================================================================================================================================