본문 바로가기

BackEnd/MongoDB

MongoDB - $addToSet

 

$addToSet

mongoDB$addToSet 연산자는 타입이 배열인 필드에 값을 추가할 수 있는 연산자입니다.

배열 안에 중복인 값이 있다면 추가되지 않습니다.

{ $addToSet: { <field1>: <value1>, ... } }

 

Missing Field

값을 추가하려는 필드가 없다면 필드를 생성하고 그 안에 배열 타입인 값을 추가합니다. 

단! 배열의 순서를 보장하진 않습니다.

 

Field is Not an Array

필드는 반드시 배열 타입이어야 합니다

만약 아래와 같은 document가 있을 때

{ _id: 1, colors: "blue,green,red" }

$addToSet으로 update를 해도 colors의 타입은 string이기 때문에 연산이 실패합니다.

db.update(
   { _id: 1 },
   { $addToSet: { colors: "c" } }
)

 

Value to Add is an Array

값이 배열인 경우 $addToSet 연산자는 배열을 단일 요소로 추가합니다.

 

아래와 같은 예시가 있을 때

{ _id: 1, letters: ["a", "b"] }

 

아래와 같이 ["c", "d"]를 letters에 추가하려고 한다면 결과는

db.update(
   { _id: 1 },
   { $addToSet: { letters: [ "c", "d" ] } }
)

 

아래와 같이 됩니다.

{ _id: 1, letters: [ "a", "b", [ "c", "d" ] ] }

 

따라서 $addToSet으로 값을 추가하고 싶을 때 배열 타입인 값을 추가 하면 안 됩니다.

 

정상적인 예시

{ _id: 1, item: "polarizing_filter", tags: [ "electronics", "camera" ] }
// yet
db.update(
   { _id: 1 },
   { $addToSet: { tags: "accessories" } }
)

// already
db.update(
   { _id: 1 },
   { $addToSet: { tags: "camera"  } }
)

 

결과

{ _id: 1, item: "polarizing_filter", tags: [ "electronics", "camera", "accessories" ] }

 

 

Tip

본문에서는 $addToSet을 쓸 때는 배열 타입 값을 추가하면 안 된다고 적었지만 $each 수정자를 쓰면 가능합니다.
$each 수정자는 $addToSet 연산자와 같이 쓸 수 있습니다.

아래와 같은 예시가 있을 때

{ _id: 2, item: "cable", tags: [ "electronics", "supplies" ] }

 

$addToSet과 $each를 같이 써서 작성하면 아래와 같이 됩니다.

db.update(
   { _id: 2 },
   { $addToSet: { tags: { $each: [ "camera", "electronics", "accessories" ] } } }
 )

이렇게 작성한다면 $addToSet은 $each로 배열의 요소를 하나씩 검사하며 이미 존재하는 값은 무시하고 값이 없다면 배열에 요소를 추가할 것입니다.

 

결과

{
  _id: 2,
  item: "cable",
  tags: [ "electronics", "supplies", "camera", "accessories" ]
}

'BackEnd > MongoDB' 카테고리의 다른 글

배치 작업 어디까지 해봤니?  (0) 2022.12.03
MongoDB Replica Set  (1) 2022.09.25
MongoDB - BulkWrite  (0) 2022.09.22