위 페이지에서 RDBMS에서 사용하는 SQL과 Mongo Query에 대해서 비교해주고 있다.
그 중 having 절을 Mongo Query로 어떻게 생성할까?
방법만 이야기 해보면 $match를 한 번 더 하면 된다.
예를 들면 고객별 날짜별 구입가격 합을 구하는 SQL이 아래와 같이 있다고 하자.
SELECT cust_id, ord_date, SUM(price) AS total FROM orders GROUP BY cust_id, ord_date 여기에 일별 총 구매가가 250 이상인 고객만 가져오고 싶다면 having 절을 사용한다. SELECT cust_id, ord_date, SUM(price) AS total
FROM orders GROUP BY cust_id, ord_date HAVING total > 250
|
이를 Mongo Query로 변환하면 아래와 같다.
db.orders.aggregate([ { $group : { _id: {
cust_id:"$cust_id",
ord_date: {
year: { $year: "ord_date" },
month: { $month: "$ord_date" },
day: { $dayOfMonth: "$ord_date" }
}
},
total: { $sum: "$price" }
}
}]) having 절을 추가하고자 한다면 위에서 언급했듯이 $match를 한 번 더 하면 된다. db.orders.aggregate([
{ $group : { _id: {
cust_id:"$cust_id",
ord_date: {
year: { $year: "ord_date" },
month: { $month: "$ord_date" },
day: { $dayOfMonth: "$ord_date" }
}
},
total: { $sum: "$price" }
}
}, { $match: { total: { $gt : 250 } } }
]) |
어렵지 않다. 그렇다면 Java API로는 어떻게 적용할까?
Aggregation.newAggregation(match, group, skip, limit, havingMatch);
newAggregation 함수는 AggregationOperation 타입의 파라메터를 순서대로 적용한다.
위 샘플 코드를 보면 match, havingMatch 두 개의 match가 존재한다.(변수명은 다르지만 동일한 기능을 하는 match다)
이 경우 동작 순서는 아래와 같다.
- match
SQL로 보면 WHERE절에 해당된다. 전체 데이터에서 집계 대상이 되는 데이터를 미리 걸리내는 것이다. - group
1번 match를 통한 결과, 즉, 집계 대상이 되는 데이터를 grouping 한다. SQL로 보면 GROUP BY 절이다. - skip, limit
skip, limit 는 paging 처리를 하기 위한 operation이다.
skip은 지정된 수 만큼 row를 제외하는 것이고, limit는 지정된 수 건까지 row를 제한하는 것이다. 즉, skip ~ limit 까지 데이터를 가져온다고 생각하면 된다. - havingMatch
1,2,3 번 operation을 모두 수행후 match를 한 번 더 수행한다.
위 SQL 비교 예제에서 $match : { total: { $gt : 250 } } 에 해당하는 부분이다.
이렇게 aggregation객체를 생성할 때 AggregationOperation에 match를 한 번 더 수행하면 having 절을 구현할 수 있다.
'BigData > MongoDB' 카테고리의 다른 글
MongoDB Aggregation시 Document Size 오류 (0) | 2015.03.05 |
---|---|
MongoDB paddingFactor 옵션 (0) | 2015.03.05 |
MongoDB 인덱스 관리 (0) | 2015.03.05 |