게시글

5만명이 선택한 평균 별점 4.9의 제로초 프로그래밍 강좌! 로드맵만 따라오면 됩니다! 클릭
강좌10 - MongoDB - 8년 전 등록

배열 수정 연산자

안녕하세요. 마지막으로 배열 수정 연산자에 대하여 알아보겠습니다. 연산자가 참 많죠? 다 외우기 힘드니까 필요한 것은 그때그때 찾아보면 됩니다. 몽고DB에서는 배열이 많이 쓰이기 때문에 배열 관련된 연산자가 많습니다.

배열 수정 연산자

$

투사 연산자로 쓰이는 $가 아니라 배열을 수정할 때 쓰이는 연산자입니다. list: [1, 2, 3] 이라는 필드가 있다고 칩시다.

db.zero.update({ list: 2 }, { 'list.$': 5 }) // list: [1, 5, 3]

위의 쿼리를 통해 두 번째 요소를 바꿀 수 있습니다. 즉 찾은 값의 위치를 기억하는 연산자입니다.

$addToSet

배열필드에 해당 요소가 없으면 추가하고 있으면 아무것도 하지 않습니다. 몽고DB에서 자체적으로 배열에 해당 요소가 있는지 검사해주기 때문에 편합니다.

{ $addToSet: { 필드1: 값, 필드2: 값, ... } }

$pop

배열 메소드처럼 몽고DB 배열에서 맨 앞 또는 맨 뒤 요소를 꺼내는 겁니다. shift와 pop을 합쳐놓은 연산자입니다. -1 값은 shift 기능, 1 값은 pop 기능을 합니다.

{ $pop: { 필드1: ±1, 필드2: ±1, ... } }

$pull

배열에서 조건을 만족하는 특정한 요소를 꺼냅니다. 꺼내는 조건은 쿼리 연산자와 같습니다.

{ $pull: { 조건1, 조건2, ... } }

$pullAll

$pull 연산자와는 달리 $pullAll은 조건이 아니라 그냥 일치하는 값을 배열에서 꺼냅니다.

{ $pullAll: { 필드: [값1, 값2, ...] } }

$push

배열 필드에 값을 push합니다. 

{ $push: { 필드1: 값, 필드2: 값, ... } }

조심해야할 것은 값이 배열일 경우 한 번에 push해버립니다. 만약 원래 [1, 2]라는 배열이 있다면 [3, 4, 5]를 push할 경우 [1, 2, [3, 4, 5]]가 되어버립니다. 3, 4, 5를 따로따로 push하고 싶다면

{ $push: { 필드: { $each: 배열 } } }

해야 합니다.

$each

방금 위에서도 사용되었습니다. 다른 용례로 $addToSet과 같이 사용하는 경우가 있습니다. $addToSet도 $push처럼 한 번에 배열을 집어넣기 때문에 따로따로 넣고 싶다면

{ $addToSet: { 필드: { $each: 배열 } } }

해야 합니다.

$slice

투사 연산자에서 나왔던 $slice인데요. 그 때 $slice는 보여줄 때만 일부 추려서 보여준거라면, 지금의 $slice는 배열을 $push할 때 개수를 제한할 수 있습니다. 또한 반드시 $each함께 사용되어야 합니다.

{ $push: { 필드: { $each: 배열, $slice: 숫자 } } }

숫자가 양수면 처음부터 숫자만큼, 음수면 마지막에서부터 숫자만큼만 저장합니다. 예를 들어 필드에 [1, 2, 3]이 있었고, $each로 [4, 5, 6]을 넣는데 $slice의 숫자가 -5면 마지막에서 5개만 저장하기 때문에 [1, 2, 3, 4, 5, 6]에서 [2, 3, 4, 5, 6]이 저장됩니다. 만약 처음에 [4, 5, 6]이 있었고 $each로 [1, 2, 3]을 넣는데 $slice가 4면 [1, 2, 3, 4]만 저장됩니다.

$sort

배열의 요소들을 정렬하는 연산자입니다. $sort 또한 $push를 보조하는 역할로 사용됩니다. 그리고 $each함께 사용되어야 합니다.

{ $push: { 필드: { $each: 배열, $sort: { 정렬기준 } } }

정렬기준은 1이면 오름차순, -1이면 내림차순입니다. 만약 배열 안에 객체가 있다면 정렬 기준으로 { 객체필드: ±1 } 하면 됩니다.

$position

역시 $push를 보조하는 역할로 사용되고, $each함께 사용되어야 합니다. $push할 위치를 지정하는 역할을 합니다.

{ $push: { 필드: { $each: 배열, $position: 위치 } }

만약 기존에 [1, 2, 3]이 있고, $each로 추가할 배열이 [4, 5, 6]이며 $position이 0이면 [4, 5, 6, 1, 2, 3]이 됩니다. 만약 $position이 2면, [1, 2, 4, 5, 6, 3]이 됩니다.

다음 시간은 인덱스(Index)에 대해서 알아보겠습니다.

조회수:
0
목록
투표로 게시글에 관해 피드백을 해주시면 게시글 수정 시 반영됩니다. 오류가 있다면 어떤 부분에 오류가 있는지도 알려주세요! 잘못된 정보가 퍼져나가지 않도록 도와주세요.
Copyright 2016- . 무단 전재 및 재배포 금지. 출처 표기 시 인용 가능.
5만명이 선택한 평균 별점 4.9의 제로초 프로그래밍 강좌! 로드맵만 따라오면 됩니다! 클릭

댓글

1개의 댓글이 있습니다.
7년 전
항상 잘 참고하고 있습니다. 한가지 질문이 있는데요. $push와 $each를 같이 쓸 때에도
$addToSet처럼 배열에서 각 요소가 있는지 검사하나요?
7년 전
아뇨 push는 검사하지 않습니다.