-
MongoDB aggregate 사용해보기설치&설정 관련 2019. 5. 26. 15:11728x90
MongoDB aggregate 사용
다음과 같은 형식의 여러 ROW의 데이터를 하나의 데이터로 표현 하고 싶었다.
# DATA { "_id" : ObjectId("5c864b1e1cd4038eed5b5633"), "link_tag" : [ "#핫앤쿨", "#마스크팩", "#홈케어", "#리뉴메디", "#젊줌마", "#예뻐지는시간" ], "name" : "홈케어", "text" : "젊어지는시간\n. .\n\n#핫앤쿨 #마스크팩 #홈케어\n#리뉴메디 #젊줌마 #예뻐지는시간", "owner" : "10961953345", "shortcode" : "Bu3eX2iHIFG", "display_url" : "https://scontent-icn1-1.cdninstagram.com/vp/c330b55401b96aca266acca202386b42/5D08D97D/t51.2885-15/e35/54446467_181108306201409_5180562059450456961_n.jpg?_nc_ht=scontent-icn1-1.cdninstagram.com", "is_video" : false, "accessibility_caption" : "Image may contain: 1 person", "writed_date" : ISODate("2019-03-11T11:44:00.000Z"), "hash" : "086e2b6a65b823c887ef1afc19734f67", "createdAt" : ISODate("2019-03-11T11:48:46.276Z"), "updatedAt" : ISODate("2019-03-11T12:22:43.532Z"), "__v" : 3 } /* 2 */ { "_id" : ObjectId("5c864b1e1cd4038eed5b5632"), "link_tag" : [ "#토니슈어", "#다낭까지와서", "#이러고있다", "#간절한걸어떡함", "#플라즈마", "#갈바닉", "#너네둘만믿는다", "#동안피부", "#얼굴마사지기", "#피부개선", "#탄력", "#피부미용기기", "#미용", "#홈케어", "#피부미인", "#데일리", "#뷰티", "#살균", "#셀프", "#피부질환", "#플라즈마", "#트러블케어", "#피부", "#피부과", "#선물", "#물광피부", "#보습", "#안티에이징", "#led마스크", "#미백", "#콜라겐" ], "name" : "홈케어", "text" : "토니느님~ 제 피부를 10년전으로 돌려주세요\n\n제발요....♡ .\n\n#토니슈어 #다낭까지와서 #이러고있다 #간절한걸어떡함 #플라즈마 #갈바닉 #너네둘만믿는다 #동안피부 가즈앙~ \n#얼굴마사지기 #피부개선 #탄력 #피부미용기기 #미용 #홈케어 #피부미인 #데일리 #뷰티 #살균 #셀프 #피부질환 #플라즈마 #트러블케어 #피부 #피부과 #선물 #물광피부 #보습 #안티에이징 #led마스크 #미백 #콜라겐", "owner" : "10698447319", "shortcode" : "Bu3e2n_jrrE", "display_url" : "https://scontent-icn1-1.cdninstagram.com/vp/97d840dbdea55753d2a976302f90002b/5D065CE9/t51.2885-15/fr/e15/s1080x1080/53176269_319394038719034_3474616797099883761_n.jpg?_nc_ht=scontent-icn1-1.cdninstagram.com", "is_video" : false, "accessibility_caption" : "Image may contain: outdoor and water", "writed_date" : ISODate("2019-03-11T11:48:12.000Z"), "hash" : "c9a418d8295391c1c83553f0316d1127", "createdAt" : ISODate("2019-03-11T11:48:46.266Z"), "updatedAt" : ISODate("2019-03-11T12:22:43.527Z"), "__v" : 3 }
원하는 결과 데이터
[ { "tag" : "#미백", "count" : 3}, { "tag" : "#물광", "count" : 4}, { "tag" : "#보습", "count" : 10}, ... ]
구글을 검색하니 $push명령어를 찾았다.
내가 처리한 Query는 다음과 같다.
db.hashtag.aggregate([ { $match: { $and: [{ name: "테그명" }, { "createdAt": { $gte: (new Date()), $lt: (new Date()) } }] } }, {$unwind: "$link_tag"}, {$group:{_id:null, clrs: {$push: {name: "$link_tag", count:1}}}}, {$unwind: "$clrs"}, {$group:{_id:"$clrs.name", size: {$sum:"$clrs.count"}}}, { $sort: { size:-1} }, { $limit : 5 }, {$project: {_id:1, size:1 } ]);
이렇게 처리 하면 다음과 같은 결과를 받을 수 있다.
[ { _id:"#물광", size:15 }, { _id:"#홈케어", size:13 } { _id:"#대일리", size:12 } ]
다음은 매 시간별로 수집된 데이터를 counting 하는 query 이다.
내가 원하는 결과는 다음과 같다.[ {"date": "2018-03-14 10", "count":30}, {"date": "2018-03-14 11", "count":20}, {"date": "2018-03-14 12", "count":33}, {"date": "2018-03-14 13", "count":34} ]
다행이 이번 QUERY는 한방에 처리 하였다.
db.hashtag.aggregate([ { $match: { $and: [{ name: "태그명" }, { "createdAt": { $gte: (new Date()), $lt: (new Date()) } }] } }, { $group: { _id: { hour: { $hour: "$createdAt" }, day: { $dayOfMonth: "$createdAt" }, month: { $month: "$createdAt" }, year: { $year: "$createdAt" } }, value: { $sum: 1 }, date: { $first: "$createdAt" }, sortDate: { $first: "$createdAt" } } }, { $project: { date: { $dateToString: { format: "%Y-%m-%d %H", date: "$date" } }, sortDate: 1, value: 1, _id: 0 } }, { $sort: { sortDate: 1 }} ])
분명히 많은 기능을 Mongodb에서 제공해주고 있는데, 잘 쓰지 못하고 있다...
노력하자.
참고 자료
728x90'설치&설정 관련' 카테고리의 다른 글
Nginx source를 이용한 compile 설치 (0) 2019.07.05 pupperteer를 이용한 화면 캡처 기능 개발 (0) 2019.05.26 puppeteer를 Ubuntu에 설치하고 기동하기 (0) 2019.05.26 crt, key 인증서 파일 pem으로 변환 (0) 2019.05.26 AWS LAMBDA를 이용해서 개발하다 (0) 2019.05.26