본문 바로가기

DB/MongoDB

[MongoDB] 15. 집계명령어 - 다양한 연산자, 뷰

728x90
반응형

문자열 연산자

문자열 연산자 기능
$concat 두 개 이상의 문자열을 단일 문자열로 연결
$strcasecmp 대/소문자를 구분하지 않는 문자열 비교를 하며, 숫자를 반환 한다.
$substrBytes 문자열의 부분 문자열을 만듦
$toLower 문자열을 모두 소문자로
$toUpper 문자열을 모두 대문자로

$concat

db.text.aggregate([
	{
		$project : {text:1,"concat":{$concat:["$text1","-","$text2"]}}
    }
])

$strcasecmp

db.text.aggregate([
	{
		$project : {text:1,"strcasecmp":{$strcasecmp:["$text1","$text2"]}}
    }
])

$substrBytes

db.text.aggregate([
	{
		$project : {text1:1,"substring":{$substrBytes:["$text1",1,2]}}
    }
])
// 1번 인덱스부터 2개

 

$toLower

db.text.aggregate([
	{
    	$project : {_id:0,text2:1,"Lower":{$toLower:"$text2"}}
    }
])

$toUpper

db.text.aggregate([
	{
    	$project : {_id:0,text1:1,"Upper":{$toUpper:"$text1"}}
    }
])

 

산술 연산자

산술 연산자 기능
$add 첫 번째 숫자와 두 번째 숫자를 더함.
$divide 첫 번째 숫자를 두 번째 숫자로 나눔
$mod 첫 번째 숫자를 나머지 두 번째 숫자로 나눔
$multiply 숫자 배열을 곱함
$subtract 첫 번째 숫자에서 두 번째 숫자를 뺌.

$add

db.rating.aggregate([
	{
		$project : {_id:0,rating:1,user_id:1,"add":{$add:["$rating","$user_id"]}}
	}
])

$divde

db.rating.aggregate([
	{
		$project : {_id:0,rating:1,user_id:1,"divide":{$divide:["$rating","$user_id"]}}
	}
])

$mod

db.rating.aggregate([
	{
		$project : {_id:0,rating:1,user_id:1,"mod":{$mod:["$rating","$user_id"]}}
	}
])

$multiply

db.rating.aggregate([
	{
		$project : {_id:0,rating:1,user_id:1,"mul":{$multiply:["$rating","$user_id"]}}
	}
])

$subtract

db.rating.aggregate([
	{
		$project : {_id:0,rating:1,user_id:1,"sub":{$subtract:["$rating","$user_id"]}}
	}
])

날짜/시간 연산자

날짜/시간 연산자 기능
$dayOfYear 연 중의 일 (1 ~ 366 사이)
$dayOfMonth 월 중의 일 (1 ~ 31 사이)
$dayOfWeek 주 중의 일 (1 ~ 7 사이, 1은 일요일을 의미)
$year 날짜의 연 부분
$month 날짜의 월 부분 (1 ~ 12 사이)
$week 연 중 주 (0 ~ 53 사이)
$hour 시간 (0 ~ 23 사이)
$minute 분 (0 ~ 59 사이)
$second 초 (0 ~ 59 사이)
$millisecond 시간 중 밀리초 (0 ~ 999 사이)

$dayOfYear , $dayOfWeek

db.dates.aggregate([
	{
		$project : {
        	_id : 0,
            today:1,
			dayOfYear : {$dayOfYear : "$today"},
			dayOfWeek : {$dayOfWeek : "$today"},
        }
	}
])

$year, $month, $dayOfMonth, $hour, $minute, $second, $millisecond

db.dates.aggregate([
	{
		$project : {
        	_id : 0,
            today:1,
			year : {$year : "$today"},
			month : {$month : "$today"},
			day : {$dayOfMonth : "$today"},
			hour : {$hour : "$today"},
			minute : {$minute : "$today"},
			second : {$second : "$today"},
            millisec : {$millisecond : "$today"}
        }
	}
])

$week

db.dates.aggregate([
	{
		$project : {Week : {$week : "$today"}}
	}
])

$_id를 날짜로 변환하기

  • $toDate를 통해 변환할 수 있음.
  • ObjdctId는 다음과 같이 구성되어 있음.

db.dates.aggregate([
	{
		$project : {date : {$toDate : "$_id"}}
	},
    	{
		$project : {
        		createAt : {
				year : {$year : "$date"},
            			month : {$month : "$date"},
            			day : {$dayOfMonth : "$date"},
				hour : {$hour : "$date"},
				minute : {$minute : "$date"},
				second : {$second : "$date"}
            		}
		}
	}
])

논리/비교 연산자

논리/비교 연산자 기능
$and 배열 내의 요소들의 and 연산
$cmp 두 값을 비교하여 결과값을 반환, 동일하면 0 반환
$cond if...then...else조건 부 논리 x ? y : z 삼항 연산자와 유사함
$eq 두 값이 동일한지 확인
$gt($gte) 하나의 값이 다른 하나의 값보다 큰지(크거나 같은지) 확인
$ifNull null 값/표현식을 지정된 값으로 변환
$lt($lte) 하나의 값이 다른 하나의 값보다 작은지(작거나 같은지) 확인
$ne 두 값이 서로 다른지 확인
$not 주어진 값의 반대 조건을 반환 true -> false
$or 배열 내의 요소들의 or 연산

$and 

db.nums.aggregate([
    {
    	$project : {and : {$and : [true,true, true]}}
    }
])

$cmp

db.nums.aggregate([
    {
    	$project : {cmp : {$cmp : ["$i1","$i2"]}}
    }
])
db.nums.aggregate([
    {
    	$project : {cmp : {$cmp : ["$i1","$i1"]}}
    }
])

$cond

db.nums.aggregate([
	{
    		$project : {
			GoodBad : {
            			$cond : {if : {$gt : ["$i1",1]},then : "GOOD", else : "BAD"}
            		}
        	}
    	}
])

$eq

db.nums.aggregate([
	{
    	$project : {eq : {$eq : ["$i1","$i2"]}}
    }
])

$gt($gte)

db.nums.aggregate([
	{
    	$project : {gt : {$gt : [1,30]},gte : {$gte : ["$i1","$i2"]}}
    }
])

$lt($lte)

db.nums.aggregate([
	{
		$project : {_id:0,lt:{$lt:[1,2]},lte:{$lte:[1,1]}}
    }
])

$ifNull

db.nums.aggregate([
	{
		$project : {_id:0,ifNull:{$ifNull:[null,"Null 입니다."]}}
    }
])

$ne

db.nums.aggregate([{$project:{_id:0,ne:{$ne:[1,2]}}}])

$not

db.nums.aggregate([{$project:{_id:0,not:{$not:[true]}}}])

$or

db.nums.aggregate([{$project:{_id:0,or:{$or:[true,false,false]}}}])

배열 연산자

배열 연산자 기능
$setEquals 두 개의 집합이 완전히 같은 요소를 가지면 true
$setIntersection 두 개의 집합이 공통적으로 존재하는 요소의 배열을 반환
$setDifference 두 번째 집합에 없는 첫 번째 집합의 요소를 반환
$setUnion 두 집합의 합집합을 반환
$setIsSubset 두 번째 집합이 첫 번째 집합의 부분 집합이면 true
$anyElementTrue 집합의 요소 중 그 어느 하나라도 true면 true
$allElementsTrue 집합의 모든 요소가 true면 true
$not 주어진 값의 반대 조건을 반환
$or 배열의 값 중 어느 하나라도 true 인 경우 true

$setEquals

db.array.aggregate([
    {
    	$project : {IsEqual : {$setEquals:[[1,2,3,4],[2,3,4]]}}
    }
])

$setIntersection

db.array.aggregate([
    {
    	$project : {InterSec : {$setIntersection:[[1,2],[1,2,3,4,5]]}}
    }
])

$setDifference

db.array.aggregate([
    {
    	$project : {Diff : {$setDifference:[[1,2,3,4],[2,3,4]]}}
    }
])

$setUnion

db.array.aggregate([
    {
    	$project : {Union : {$setUnion:[[1,2,3,4],[5,6,7]]}}
    }
])

$setIsSubset

db.array.aggregate([
    {
    	$project : {IsSubset : {$setIsSubset:[[1,2,3,4],[5,6,7]]}}
    }
])

$anyElementTrue

db.array.aggregate([
    {
    	$project : {True : {$anyElementTrue:[[true,true,false,true]]}}
    }
])

$allElementsTrue

db.array.aggregate([
    {
    	$project : {AllTrue : {$allElementsTrue:[[true,true,false,true]]}}
    }
])

$not

db.array.aggregate([
    {
    	$project : {converse: {$not:[false]}}
    }
])

$or

db.array.aggregate([
    {
    	$project : {or: {$or:[true,false,true]}}
    }
])

 

뷰(view)

  • 다른 컬렉션에서 정보를 집계한 가상 컬렉션
  • 뷰에 집계한 정보는 저장되지 않음.
  • 뷰는 직접 쓰고, 수정과 삭제는 불가능함.
db.createView(
	"testView",
    	"rating",
    	[{$project : {user_id:1}}]
)

db.testView.drop()

728x90
반응형