尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

MongoDB 之 aggregate $lookup 关联查询 进阶篇

MongoDB 之 aggregate $lookup 关联查询 进阶篇 需求:要对 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
返回列表