본문 바로가기
블로그 이미지

방문해 주셔서 감사합니다! 항상 행복하세요!

  
   - 문의사항은 메일 또는 댓글로 언제든 연락주세요.
   - "해줘","답 내놔" 같은 질문은 답변드리지 않습니다.
   - 메일주소 : lts06069@naver.com


몽고DB/Nodejs 몽고DB

Node.js mongoose Aggregate

야근없는 행복한 삶을 위해 ~
by 마샤와 곰 2019. 8. 1.

 

 

mongoose에서의 몽고db의 집계함수 실행은 mongodb에서의 쿼리와 형태가 거의 같다.

또한 java와 python과의 속도 비교에서도 거의 비슷하다.

var mongoose = require("mongoose");
var Schema = mongoose.Schema;
// Connection URL
var url = 'mongodb://127.0.0.1:27017/admin';
mongoose.connect(url, { useNewUrlParser: true });  //옵션 파라미터는 몽고db버전에 따라 다르다

var structor = new Schema({
    "date":Date,
    "random_text1" : String,
    "random_text2" : String
});
structor.set('collection', 'test_db');  //여기서 컬렉션 지정을 안하면 조회대상을 못 찾을 수 있다.
var target = mongoose.model("test_db", structor );

target.aggregate([
	{
		$group: {
			_id:{
				random_text1: "$random_text1",   //매핑할 대상 및 결과 이름
				random_text2: "$random_text2",
				date:"$date"
			},
			count: { "$sum": 1 }  
		}
	}
],function(rr,ra){
	if(ra){
		console.log(ra);   
	} 
});

group을 통한 매핑의 예제이다. aggregate 내부의 파라미터는 배열러 받을 수 있으며 json형식으로 구성되어 있다.

count 뿐만 아니라 sum 을 통해서 대상 도큐먼트의 합계, avg를 통한 평균을 구할 수도 있다.

 

만약, 매핑되는 객체의 이름을 바꾸고자한다면 아래와같은 옵션을 넣어주면 된다.

  {
      $project:{
          daying: { $dateToString: { format: "%Y-%m-%d", date: "$date" } },  //date 형식 변경
          random_text1: 1,   //가져올 대상을 숫자1로 카운트하게 지정
          random_text2: 1,
          reg_origin_date: "$date"  //date이름을 reg_origin_date로 변경
      }
  }

 

조건절은 match를 통해서 실시한다.

    { 
        $match: { 
          $and: [
             { reg_origin_date: { $gte:  new Date('2019-06-03'), $lte: new Date('2019-07-19') } }
          ] 
    	} 
	}, 

 

skip과 limit을 통한 페이징 처리도 가능하다.

    { $limit: 1000000 },                        
    { $skip: 0 },

 

위 내용을 전부 합친 소스이다.

var mongoose = require("mongoose");
var Schema = mongoose.Schema;

var url = 'mongodb://127.0.0.1:27017/admin';
mongoose.connect(url, { useNewUrlParser: true });

var structor = new Schema({
    "date":Date,
    "random_text1" : String,
    "random_text2" : String
});
structor.set('collection', 'test_db');  
var target = mongoose.model("test_db", structor );

target.aggregate([
	{
		$project:{
			daying: { $dateToString: { format: "%Y-%m-%d", date: "$date" } },
			random_text1: 1, 
			random_text2: 1,
			reg_origin_date: "$date"
		}
	},            
	{ 
		$match: { 
			$and: [
				{ reg_origin_date: { $gte:  new Date('2019-06-03'), $lte: new Date('2019-07-19') } }
			] 
		} 
	}, 
	{ $limit: 1000000 },                        
	{ $skip: 0 },
	{
		$group: {
			_id:{
				random_text1: "$random_text1", 
				random_text2: "$random_text2",
				daying:"$daying"
			},
			count: { "$sum": 1 }
		}
	}
],function(rr,ra){
	if(ra){
		console.log(ra);   
	}  
});
반응형
* 위 에니메이션은 Html의 캔버스(canvas)기반으로 동작하는 기능 입니다. Html 캔버스 튜토리얼 도 한번 살펴보세요~ :)
* 직접 만든 Html 캔버스 애니메이션 도 한번 살펴보세요~ :)

댓글