éæ±ï¼è¦å¯¹ topics é®é¢è¡¨æ ¹æ® teach_idï¼æå¸IDï¼ï¼tips._idï¼é®é¢æ ç¾IDï¼ åæ®µè¿è¡åç»ç»è®¡æå¸çç颿 åµçææ¥è¡¨ï¼æä»¥å¾æ ¹æ® æå¸IDï¼æ ç¾ID å ³èæ¥è¯¢åº æå¸ä¿¡æ¯ï¼æ ç¾ä¿¡æ¯ ç¨ä½æ¥è¡¨å±ç¤ºãæ¬æåºäº MongoDB V3.2 èåæ¥è¯¢è¯æ³ï¼V3.6 å¯ä½¿ç¨æ´å¤çç¹æ§å®ç°topics è¡¨æ°æ®ç»æï¼{_id : ffffea46-ab7d-4c19-afa4-fe37709d5300,evaluation_type : 3,type : 3,content : ä¸è¬çº³ç¨äººæä¹ç»è½¬ææ¬,tips : [{_id : 1000,tip_name : ä¼è®¡åºç¡}],update_at : NumberLong(1469801351305),author_id : 10334093,timestamp : NumberLong(1469714932097),race_time : NumberLong(1469714947334),teach_id : 10122995,last_reply_content : è¿å°±è¦çä½ ç¨çæ¯ä»ä¹ææ¬è®¡ä»·æ¹æ³ã,last_reply_at : NumberLong(1469715279859),end_type : 2}仿°æ®ç»æä¸å¯ä»¥ç¥éç¬¬ä¸æ¥æä½æ¯ï¼æ ¹æ® teach_idï¼tips._id åæ®µè¿è¡åç»ï¼å¯å¾ groupï¼åç»ï¼ è¯å¥ï¼$group:{_id:{teacherId:$teach_id,tipId:$tips._id},evaluationTypes:{$push:$evaluation_type},sum: {$sum: 1}}$push宿¹ææ¡£(https://docs.mongodb.com/manual/reference/operator/update/push/index.html)$pushï¼å¯ä»¥åç»ä¹åæ evaluation_type åæ®µå¼ èµç» evaluationTypes å å ¥å°åç»ä¹åçè¿åå¼ä¸$sum宿¹ææ¡£(https://docs.mongodb.com/manual/reference/operator/aggregation/sum/index.html)$sumï¼å¯å¾å° teach_idï¼tips._id é½ç¸åçè®°å½æ¡æ°ä½¿ç¨èæ¬ï¼db.getCollection(topics).aggregate([** {$match:{race_time : {$gte:1522512000000,$lte:1525103999000},type:3}},{$group:{_id:{teacherId:$teach_id,tipId:$tips._id},evaluationTypes:{$push:$evaluation_type},sum: {$sum: 1}}}])æ¥è¯¢ç»æï¼**ä»ç»æå¯ä»¥çåº æå¸ï¼10706280 å¨è¿ä¸ªæ ç¾ï¼1002 ä¸ä¸å ±æ¢çäº 4 æ¡é®é¢ï¼ä»¥åé®é¢ç evaluationTypesï¼è¯ä»·ç±»åï¼ä¸ä¸ªåç»ä½ä¸ºæ¥è¡¨ç䏿¡è®°å½ï¼æä»¥æä»¬å¾è®¡ç®æ¥è¡¨çæ»è®°å½æ°ï¼æ»è¡æ°ï¼totalï¼æä»¥å对å好ç»çè®°å½è¿è¡æ æ¡ä»¶åç»ï¼_id: nullï¼**使ç¨èæ¬ï¼**db.getCollection(topics).aggregate([{$match:{race_time : {$gte:1525103910000,$lte:1525103999000},type:3}},{$group:{_id:{teacherId:$teach_id,tipId:$tips._id},evaluationTypes:{$push:$evaluation_type},sum: {$sum: 1}}},{$group:{_id: null,list:{$push:$$ROOT},total: {$sum: 1}}}])$$ROOT æå®çæ¯åç»åçæææ°æ®ï¼æä»¥ list ä¼æç¬¬ä¸æ¬¡åç»å¾å°çæ°æ®é½å¸¦ä¸total æ¯ç¬¬ä¸æ¬¡åç»ä¹åçè®°å½æ°ï¼å³ä¸å ±åäºå¤å°ç»ï¼ä¹åç¨ä½åé¡µæ»æ°æ¥è¯¢ç»æï¼è¿éç group 使ç¨å¯åèï¼MongoDB ä¹ aggregate $group å·§å¦è¿ç¨æå¸ID ä»¥å æ ç¾ID çä¿¡æ¯å å«å¨ list éåéï¼æä»¥éè¦å¯¹ list è¿è¡æå¹³åï¼$unwindï¼æä½ï¼å¯åèï¼MongoDB èååµå ¥çæ°ç»ï¼æå¹³åæ°æ®ç®¡éï¼ä½¿ç¨èæ¬ï¼**db.getCollection(topics).aggregate([{$match:{race_time : {$gte:1522512000000,$lte:1525103999000},type:3}},{$group:{_id:{teacherId:$teach_id,tipId:$tips._id},evaluationTypes:{$push:$evaluation_type},sum: {$sum: 1}}},{$group:{_id: null,list:{$push:$$ROOT},total: {$sum: 1}}},{$unwind:$list},{$sort: {list.sum: -1}},{$skip: 0},{$limit: 100}])æ¥è¯¢ç»æï¼**æå¹³å list éåæ°æ®ä¹åï¼å¯æ ¹æ® æå¸IDï¼æ ç¾ID å ³èæ¥è¯¢ï¼$lookupï¼åºæå¸ä¿¡æ¯ï¼æ ç¾ä¿¡æ¯$lookup:{from:users,localField:list._id.teacherId,foreignField: _id,as: users}$lookupï¼å®æ¹ææ¡£--https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/index.htmlï¼3.2çæ¬ åªè½æ ¹æ® localFieldï¼foreignField åæ¡ä»¶å ³èï¼3.6çæ¬ä¸ å ³èæ¥è¯¢å¼å ¥ pipeline ç®¡éæ¯ææ´å¤æ´ä¸°å¯çæ¥è¯¢ï¼å¯¹åºæ¬æä¼ææ´å¥½çè§£å³æ¹æ¡ãå ·ä½ä½¿ç¨å¯ä»¥æ¥ç宿¹ææ¡£ä¹å便æ¯å¯¹æ°æ®ç夿¬¡å ³èæ¥è¯¢ï¼ä»¥åæå¹³åæä½ï¼ä¸é¢è´´ä¸å®æ´æ¥è¯¢èæ¬ï¼db.getCollection(topics).aggregate([** {$match:{race_time : {$gte:1522512000000,$lte:1525103999000},type:3}},{$group:{_id:{teacherId:$teach_id,tipId:$tips._id},evaluationTypes:{$push:$evaluation_type},sum: {$sum: 1}}},{$group:{_id: null,list:{$push:$$ROOT},total: {$sum: 1}}},{$unwind:$list},{$sort: {list.sum: -1}},{$skip: 0},{$limit: 100},{$lookup:{from:users,localField:list._id.teacherId,foreignField: _id,as: users}},{$lookup:{from:tip_content,localField:list._id.tipId,foreignField: _id,as: childTip}},{$lookup:{from:tip_content,localField:childTip.parent_tip_id,foreignField: _id,as: parentTip}},{$unwind:$users},{$unwind:$childTip},{$unwind:$parentTip},{$project:{teacherId:$list._id.teacherId,teacherName:$users.real_name_from_nc,tuid:$users.tuid,mobile:$users.mobile,tipId:$childTip._id,tipName:$childTip.tip_name,parentTipId:$parentTip._id,parentTipName:$parentTip.tip_name,sum:$list.sum,total:$total,evaluationTypes:$list.evaluationTypes,_id:0}}])æ¥è¯¢ç»æï¼**作者molashaonian