$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 |