$, $[]을 이용하는 Update Query

QQQ
nodejs backend
Published in
4 min readMar 19, 2021

임베딩된 array의 데이터에서 특정 다큐먼트를 업데이트해야한다면. $ (달러 표시)를 이용합니다.

$ / $[ ]

달러 표시가 query에 쓰인다는 게 처음 보면 참 익숙하지 않습니다. 이 둘은 데이터가 array형태로 embedding된 상태로 저장되어 있을 때, 데이터를 업데이트할 때 쓰입니다.

$ (달러) 표시 = Update Operators

몽고DB에서 $ 달러 표시는 업데이트에 쓰입니다. 주로 많이 쓰는 것은

  • $set: 특정 field의 value를 변경할 때
  • $inc: 숫자로 저장되어있는 value를 증가시키거나, 감소시킬 때
  • $pop: array 형태의 값에 첫째, 혹은 마지막 아이템을 제거할 때
  • $push: array 형태의 값에 데이터를 추가할 때

위의 4가지 operator는 “$”(달러) 표시와 operator 이름이 같이 붙어있기 때문에 딱 봐도 어떤 것인지 이해가 잘가고 활용하기도 쉽습니다.

문제는 바로 “$” 와 “$[]” 이 두가지다.

$: 달러 표시만 덩그러니 쓰이니 뭘하는 건지 파악하기가 힘듭니다.

$[]: 배열 표시가 붙으니 뭘 하는건지 더 모르겠네요.

간단한 정의부터 살펴봅시다.

Array Operators - from MongoDB Document

$: Acts as a placeholder to update the first element that matches the query condition. 쿼리 조건과 일치하는 첫 번째 요소를 업데이트하는 자리 표시자 역할을 합니다.

$[]: Acts as a placeholder to update all elements in an array for the documents that match the query condition. 쿼리 조건과 일치하는 문서에 대한 배열의 모든 요소를 ​​업데이트하는 자리 표시자 역할을 합니다.

“$”

위치 연산자인 ”$" operator는 배열의 요소 위치를 명시적으로 지정하지 않은 상태로도 특정 배열의 요소를 식별하여 업데이트할 수 있게 해줍니다.

$ (달러) operator가 update에서 쓰일 때 제일 중요한 점은 query 조건과 매칭되는 첫번째 요소를 변경한다는 점입니다.

예시

위와 같은 데이터가 저장되어 있는 상태로 아래의 update문을 실행한다면,

  1. query condition과 매칭되는 첫번째 데이터를 찾습니다. "첫번째 데이터”
  2. 그리고 그 첫번째 데이터를 수정하게 됩니다.

“[ 85, 80, 80 ]” 에서 “[ 85, 82, 80 ]” 으로 수정된 것을 확인할 수 있습니다. 세번째 요소인 80은 query condition이 맞음에도 수정되지 않았습니다.

$” Operator는 첫번째 요소만을 변경합니다.

그러므로 중복되는 데이터가 있다면 $ operator을 이용하는 것은 위험합니다. 하지만 array 형태로 embedding하여 저장하는 데이터들은 중복이 될 일이 그리 많지 않습니다. (아주 주관적인 의견입니다.) 그러므로 크게 걱정은 안하여도 됩니다.

“$[ ]”

이와 반대로 "$[]" operator는 query 조건과 매칭되는 모든 데이터를 변경합니다.

위와 같은 데이터가 저장되어 있는 상태로 아래의 update문을 실행한다면,

  1. query condition과 매칭되는 모든 데이터를 찾습니다. "모든 데이터”
  2. 그리고 그 첫번째 데이터를 수정하게 됩니다.

“[ 85, 80, 80 ]” 에서 “[ 85, 82, 82 ]” 으로 수정된 것을 확인할 수 있습니다. $ query와 다르게 조건이 맞는 모든 데이터가 변경되었습니다.

“$[ ]” Operator는 모든 요소을 변경합니다.

--

--