mongo之$group+$addToSet

直接举例说明

#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': ['数学一班', '音乐一班']]}]
#=================================================================================================================================================
原文地址:https://www.cnblogs.com/zzy-9318/p/10022651.html