티스토리 뷰

http://docs.mongodb.org/manual/reference/sql-aggregation-comparison/

위 페이지에서 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다)

이 경우 동작 순서는 아래와 같다.
  1. match
    SQL로 보면 WHERE절에 해당된다. 전체 데이터에서 집계 대상이 되는 데이터를 미리 걸리내는 것이다.
  2. group
    1번 match를 통한 결과, 즉, 집계 대상이 되는 데이터를 grouping 한다. SQL로 보면 GROUP BY 절이다.
  3. skip, limit
    skip, limit 는 paging 처리를 하기 위한 operation이다.
    skip은 지정된 수 만큼 row를 제외하는 것이고, limit는 지정된 수 건까지 row를 제한하는 것이다. 즉, skip ~ limit 까지 데이터를 가져온다고 생각하면 된다.
  4. 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
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함