直接舉例說明
#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': ['數學一班', '音樂一班']]}] #=================================================================================================================================================
