본문 바로가기
[ Developer ]/MongoDB

[MongoDB] 몽고디비 집계 함수 쿼리 실습

by 김현섭. 2016. 6. 29.
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
MongoDB 집계 함수 쿼리 실습

@ Distinct 실습
Distinct를 실습하기 위해서 배열이 있는 blog로 가서 실습해본다


현재 replies에는 중복된 값들이 들어가 있기 때문에 단 4가지만 나온 것을 볼 수 있다
이제 또 test에서 실습을 해본다


test에 있는 값중에 pageView가 모두 0을 중복이 되어 있어 0 한개가 나오는 것을 볼 수 있다


@ Group 실습
실습하기에 있어서 데이터를 먼저 집어 넣는다

1
2
3
4
5
6
7
8
9
10
11
12
13
var post = {};
function addPost() {
    for(var i = 0; i < 100; i++) {
        for(var j = 0; j < 100; j++) {
            post.number = i;
            post.postNumber = j;
            post.date = new Date();
            post.comment = "Hi hello" + i + j;
            
            db.post.insert(post);
        }
    }
}
cs

그런 후 addPost();를 입력하여 데이터를 넣어보자
위와 같이 펑션으로 만들어서 입력을 하게 되면 10,000개의 데이터를 넣게 된다


데이터가 잘 들어간 것을 볼 수 있다

  1. 등록된 글 중 "number" 별 등록 개수를 구하는 Query
    • 1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      db.runCommand ( {"group" : {
          "ns" : "post",
          "key" : {"number" : 1},
          "initial" : {"count" : 0},
          "$reduce" : function (curr, result) {
              if (curr.number == result.number) {
                  result.count += 1;
              }
          }
      }})
       
      cs
    • 실행 결과
      • 위와 같이 나오면 문제없이 나온 것이다
  2. 등록된 글 중 90이상의 "number" 별 등록 개수를 구하는 Query
    • 1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      db.runCommand ( {"group" : {
          "ns" : "post",
          "key" : {"number" : 1},
          "initial" : {"count" : 0},
          "$reduce" : function (curr, result) {
              if (curr.number == result.number) {
                  result.count += 1;
              }
          },
          "condition" : { "number" : {"$gte" : 90} }
      }})
      cs
    • 실행 결과
      • 실행 결과가 90 이상인 것만 나온 것을 볼 수 있다
      • condition으로 조건을 지정해줄 수 있다
  3. 조금 간결하게 출력하기
    • 1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      db.post.group({
              "key" : {"number" : 1},
              "initial" : {"count" : 0},
              "$reduce" : function(curr, result) {
                      if(curr.number == result.number) {
                          result.count++;
                      }
              },
              "condition" : {"number" : {"$gte" : 90}}
      });
      cs
    • 실행 결과


이제는 배열을 이용한 group을 하기위해 자료를 준비해본다

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
31
32
33
var post = {};
function addPost() {
    for(var i = 0; i < 50; i++) {
        post.number = 0;
        post.tags = ["NoSQL""MySQL""Oracle"];
        db.test1.insert(post);
    }
    for(var i = 0; i < 15; i++) {
        post.number = 0;
        post.tags = ["NoSQL"];
        db.test1.insert(post);    
    }
    for(var i = 0; i < 5; i++) {
        post.number = 0;
        post.tags = ["Oracle"];
        db.test1.insert(post);
    }
    for(var i = 0; i < 10; i++) {
        post.number = 1;
        post.tags = ["NoSQL""Winter"];
        db.test1.insert(post);
    }
    for(var i = 0; i < 5; i++) {
        post.number = 1;
        post.tags = ["NoSQL"];
        db.test1.insert(post);
    }
    for(var i = 00; i < 15; i++) {
        post.number = 2;
        post.tags = ["Spring"];
        db.test1.insert(post);
    }
}