[자료정리] push vs addToset, 그리고 배열의 update조작

2021. 1. 11. 18:07프로그래밍-Web/MongoDB

둘 다 배열에 원소를 추가하는 목적으로 사용되는데

push는 중복체크를 하지 않고, addToset은 중복체크를 한다.

둘 다 배열을 조작하는 command고 체크 여부의 차이만 있으므로, 예시는 push만 들어본다.

 

0) set의 사용

 

기본적인 update 구문에서 set은 '수정'을 의미한다.

이를 설정하지 않으면 name 필터로 찾은 도큐먼트 전체가 hp:30으로 변경되니 주의

 

1) 기본적인 push 사용

 

보통 push할 element가 정해진 경우 $push:{element:value}형태로 입력하면 된다

filter로 걸러낸 document에 대해 element, value를 입력한다

물론 addToSet은 중복체크 여부에만 차이가 있고 용법은 같다

 

2) element를 여러개 넣는 경우

 

$each operator를 사용한다. 

 

3) element가 document로 구성되어있는 경우

 

scores 배열에 math, korean이라는 key를 가진 도큐먼트를 입력하는 경우다

간단하게 key까지 정의해주면 된다

 

4) element가 document로 구성되어있는 경우2

 

이렇게 dot notation을 통해 접근해도 동일하다

이건 뎁쓰가 깊은 배열이래도 동일하게 접근가능하다

예컨데 { a: { b: { c : 'hi' } } } 라면 a.b.c로 접근하면 된다

 

5) 특정 element의 index로 접근하고 싶은 경우

 

4와 동일하다. 

scores라는 배열의 두번째 element로 접근하는 것도, dot notation 을 통해 접근한다

 

6) 배열이 객체element로 구성되어있는 경우

 

이런 경우다

itemList라는 배열이 있는데, 원소는 객체인 경우

dot notation을 이용해도 itemList.resource에 접근이 불가능하다.

 

중간에 dollor notation을 끼워넣어서 접근한다.

 얘는 조건에 해당하는 첫번째 document를 리턴한다.

 

보통 update야 resource를 새로 넣는거니 상관없지만, find는 해당하는 모든 document를 찾아오는 경우가 많기 때문에 이렇게 처리한다. 

 

보통 set operator와 함께 자주 사용된다.

 

 

7) 배열의 모든 조건값을 조작하고 싶은 경우

 

위의 예시는 grade라는 배열에서 100이상이 되는 모든 애들을 100 으로 맞춰주고 싶은 경우의 쿼리이다

이때 $[element]는, 조건의 모든 값을 100으로 업데이트 시키는 경우다

6번과 조금 다른 부분은, 6의 경우 dollor notation이 처음 조건을 만족하는 element에 대해 적용되었지만

 이경우는 [element]를 만족하는 모든 element에 대해 적용된다.

 

여기서 arrayFilters라는 옵션을 사용하는데, 이 옵션을 통해 element의 조건을 명시할 수 있다.

어쨋든 dollor operation이 배열의 모든 원소를 찍는다는 사실은 변하지 않는다.

 

8) 7번 케이스 응용편

 

약간 복잡해서 배열 예시를 첨부한다

 

grade라는 배열 안에 객체가 있는 경우를 뜻한다.

multi 옵션을 true로 설정한 부분 말고는 모두 동일하다.

여기에서는 elem안에 mean이라는 객체key가 있고 dot notation으로 접근한다

그러나 옵션은 grade로 설정되어있다.

 

9) 모든 element를 조작하는 경우

 

dolloar notation에 배열을 붙이면 된다

다양한 operator의 사용이 가능하다는 것을 보여주기 위해 inc를 사용해봤다

 

 

10) 특정 element 위치 부터 원소를 push 하고 싶은 경우

 

가끔 사용하는 케이스

저 element3개짜리 배열을 push할 때, position 옵션을 지정해주면 해당 index 부터 push한다

position을 negative로 설정하면 뒤부터 시작된다