Docs Menu
Docs Home
/ /

$addToSet (업데이트 연산자)

$addToSet

$addToSet 연산자는 값이 배열에 이미 존재하지 않는 경우에만 값을 배열에 추가합니다. 이 경우 $addToSet은 해당 배열에 아무 작업도 수행하지 않습니다.

다음 환경에서 호스팅되는 배포에 $addToSet 사용할 수 있습니다.

  • MongoDB Atlas: 클라우드에서의 MongoDB 배포를 위한 완전 관리형 서비스

  • MongoDB Enterprise: MongoDB의 구독 기반 자체 관리 버전

  • MongoDB Community: MongoDB의 소스 사용 가능 무료 자체 관리 버전

$addToSet 연산자의 형식은 다음과 같습니다.

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

내장된 문서나 배열에 <field> 기호를 지정하려면 점 표기법을사용하십시오.

MongoDB 5.0부터 업데이트 연산자는 문자열 기반 이름이 있는 문서 필드를 사전순으로 처리합니다. 숫자 이름이 있는 필드는 숫자 순서대로 처리됩니다. 자세한 내용은 업데이트 운영자 동작을 참조하십시오.

$addToSet은 집합에 추가된 중복 항목이 없도록 보장하지만, 이미 존재하는 중복 요소에는 영향을 주지 않습니다. $addToSet은 수정된 집합 내 요소들의 특정 순서를 보장하지 않습니다.

MongoDB 5.0부터 빈 피연산자 표현식( { } )과 함께 $addToSet과 같은 업데이트 연산자를 사용할 때 mongod에서 더 이상 오류가 발생하지 않습니다. 업데이트가 비어 있으면 변경 사항이 없으며 oplog 항목이 생성되지 않습니다(즉, 작업이 작동하지 않음을 의미합니다).

업데이트할 문서에 없는 필드에 $addToSet를 사용하면 $addToSet는 지정된 값을 요소로 사용하여 배열 필드를 생성합니다.

$addToSet 을 배열이 아닌 필드에 사용하면 작업이 실패합니다.

예를 들어 pigments 컬렉션을 만듭니다.

db.pigments.insertOne( { _id: 1, colors: "blue, green, red" } )

colors 필드가 배열이 아닙니다. 다음 $addToSet 작업이 실패했습니다.

db.pigments.updateOne(
{ _id: 1 },
{ $addToSet: { colors: "mauve" } }
)

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

alphabet 컬렉션을 생성합니다.

db.alphabet.insertOne( { _id: 1, letters: ["a", "b"] } )

다음 작업은 letters 필드에 배열 [ "c", "d" ]을 추가합니다.

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

배열 [ "c", "d" ]이 단일 요소로 추가됩니다.

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

값의 각 요소를 별도로 추가하려면 $each 수정자를 $addToSet과 함께 사용합니다. 자세한 내용은 $each 수정자를 참조하세요.

값이 문서인 경우, 배열의 기존 문서가 추가할 문서와 정확히 일치하면 MongoDB는 해당 문서가 중복된 것으로 판단합니다. 즉, 기존 문서에는 정확히 동일한 필드와 값이 있으며 필드의 순서도 동일합니다. 필드 순서가 중요하며, MongoDB가 문서가 기존 배열 요소의 중복인지 판단하기 위해 문서의 일부 필드만 비교하도록 지정할 수 없습니다.

inventory 컬렉션을 생성합니다.

db.inventory.insertOne(
{ _id: 1, item: "polarizing_filter", tags: [ "electronics", "camera" ] }
)

다음 작업은 "accessories" 배열에 존재하지 않으므로 "accessories" 요소를 tags 배열에 추가합니다.

db.inventory.updateOne(
{ _id: 1 },
{ $addToSet: { tags: "accessories" } }
)

다음 $addToSet 연산은 "camera" 가 이미 tags 배열의 요소이므로 효과가 없습니다.

db.inventory.updateOne(
{ _id: 1 },
{ $addToSet: { tags: "camera" } }
)

$addToSet 연산자를 $each 수정자와 함께 사용할 수 있습니다. $each 수정자를 사용하면 $addToSet 연산자가 배열 필드에 여러 값을 추가할 수 있습니다.

컬렉션 inventory에는 다음 문서가 있습니다.

db.inventory.insertOne (
{ _id: 2, item: "cable", tags: [ "electronics", "supplies" ] }
)

그 후 다음 작업에서는 $each 수정자와 함께 $addToSet 연산자를 사용하여 tags 배열에 여러 요소를 추가합니다.

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

이 작업은 tags 배열에 "camera""accessories"만 추가합니다. "electronics" 이 이미 배열에 있었습니다:

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

돌아가기

$[<identifier>]

이 페이지의 내용