[Database] MongoDB :: 확장 검색 쿼리 - 집계 파이프라인

Jihyoung·2022년 7월 19일
0

Database

목록 보기
2/4
post-thumbnail

집계 파이프라인 연산자

연산자 뒤 CP 가 붙어 있는 경우는 UTF-8에서 작동한다.

이름설명예시
$concat두개 이상의 문자열을 하나로 연결 { $concat : ["$ltem", "-", "$description"] }
$strcasecmp두 개의 문자열의 대소를 비교하여
크면 1을 반환하고 작으면 -1, 같으면 0을 반환
{ $strcasecmp : [ "$quarter", "13q4" ] }
$substrASCII 문자열의 일부분을 잘라서 반환
값에 문자열, 시작문자 위치, 문자길이 순으로 넣는다.
{ $substr : [ "$quarter", 2, 1 ] }
$substrCPUTF-8 문자열의 일부분을 잘라서 반환한다.
값에 문자열, 시작문자 위치, 문자길이 순으로 넣는다.
{ $substrCP : [ "$quarter", 2, 1 ] }
$strLenCPUTF-8 문자열의 길이를 반환 { $strLenCP : "$name" }
$toLower문자열의 모든 문자를 소문자로 변환 { $toLower : "$item" }
$toUpper문자열의 모든 문자를 대문자로 변환{ $toUpper : "$item" }

예시 코드

> db.area.aggregate([
...  {
...    $project :{
...       area : {$concat : ['$city_or_province', '-', '$county']}
...       }
...    },
...  {
...     $project : {
...       city_or_province :{ $substrCP: [ '$area', 0, 2 ]},
...       county: { $substrCP: ['$area', 3, { $strLenCP: "$area"}]}
...     }
...   }
... ])

산술 연산자

이름설명예시
$add배열에 있는 숫자를 더한다.{ $add : [ "$price", "$hous", 1 ] }
$divide첫 번째 숫자를 두번째 숫자로 나눈 몫 { $divide : [ "$hours", 8 ] }
$mod첫 번째 숫자를 두 번째 숫자로 나눈 나머지 { $mod : [ "$hours", 8 ] }
$multiply배열에 있는 숫자를 곱한다. { $multiply : [ "$price", "$hours", 1 ] }
$subtract첫 번째 숫자에서 두 번째 숫자를 뺀다. $subtract : { "$hours", 8 ] }

날짜, 시간 연산자

이름설명예시
$toDate주어진 값을 Date 타입으로 변환 { $toDate : "2022-10-01" }
$dayOfYear올해 1월 1일부터 지금까지의 일수
( 1 ~ 366 )
{ $dayOfYear : new Date( "2022-10-01" ) }
$dayOfMonth이번달 1일부터 지금까지의 일수
( 1 ~ 31 )
{ $dayOfMonth : new Date( "2022-10-01" ) }
$dayOfWeek이번주 월요일부터 지금까지의 일수 { $dayOfWeek : new Date( "2022-10-01" ) }
$year날짜의 년도 { $year : new Date( "2016-01-01T12:00:03Z" ) }
$month날짜의 월 { $month : new Date( "2016-01-01T12:00:02Z" ) }
$week날짜의 연중 주( 0 ~ 53 ) { $month : new Date( "2016-01-01T12:00:01Z" ) }
$hour날짜의 시간( 0 ~ 23 ) { $month : new Date( "2016-01-01T12:00:00Z" ) }
$minute날짜의 분( 0 ~ 59 ) { $month : new Date( "2016-01-01T12:00:01Z" ) }
$second날짜의 초( 0 ~ 59 ) { $second : new Date( "2016-01-01T12:00:02Z" ) }
$millisecond날짜의 밀리초( 0 ~ 999 ) { $millisecond : new Date( "2016-01-01T12:00:03Z" ) }

예시 코드

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

논리 연산자

이름설명예시
$condif 자리에 조건을 쓰고,
참이면 then의 값을 반환,
거짓이면 else 의 값을 반환
{ $cond { if : { $gte : [ "$qty", 250 ] },
then : 30, else : 20 } }
$ifNull첫 번째 요소 값이 존재하지 않으면, 두 번째 값을 반환 { $ifNull { "$description", "Unspecified" ] }
$and주어진 모든조건을 만족하면 참( true )값을
그렇지 않으면 거짓( false )값을 반환
{ $and : [ { $gt : [ "$qty", 250 ] },
{ $lt : [ "$qty", 200 ] } ] }
$or주어진 조건 중 하나라도 만족하면 참( true )값을 반환
그렇지 않으면 거짓값( false )을 반환
{ $or : [ { $gt : [ "$qty", 250 ] },
{ $lt : [ "$qty", 200 ] } ] }
$nor주어진 조건 중 하나라도 만족하지 않으면 참( true )값을,
그렇지 않으면 거짓( false )값을 반환
{ $nor : [ { $gt : [ "qty", 250 ] },
{ $lt : [ "$qty", 200 ] } ] }
$not배열 속 값이 참이면 거짓(false)을, 거짓이면 참( true )을 반환 { $not : [ { $gt : [ "qty", 250 ] } ] }

배열 연산자

$arrayElemAt 연산자는 주어진 배열에서 정해진 순번의 요소 값을 반환하는데 여기서 순번은 0부터 시작한다.

이름설명예시
$setEquals두 배열이 같은 요소를 가지면 참값을 반환하고
아니면 거짓을 반환
{ $setEquals : [ "$A", "$B" ] }
$setSubset두 번째 배열이 첫 번째 배열의 부분 집합이면
참값을 반환하고, 아니면 거짓을 반환
{ $setSubset : [ "$A", "$B" ] }
$setIntersection두 배열의 공통된 요소를 모아서 배열로 반환{ $setIntersection : [ "$A", "$B" ] }
$setDifference첫 번째 배열에는 있고,
두 번째 배열에 없는 요소를 모아서 배열로 반환
{ $setDifference : [ "$A", "$B" ] }
$setUnion두 배열에 속한 모든 요소를 모아서 배열로 반환,
요소간 중복은 없다.
{ $setUnion : [ "$A", "$B" ] }
$arrayElemAt주어진 배열속의 정해진 순번의 요소를 반환 { $arrayElemAt : [[ true, false, 1 ], 1] }
profile
로그를 생활화

1개의 댓글

comment-user-thumbnail
2023년 3월 27일

노시퀄도 학습을 하고 계셨군요 좋습니다

답글 달기