문서 메뉴
문서 홈
/
MongoDB 매뉴얼
/ / / /

$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에는 다음 문서가 있습니다.

{ _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>]

다음

$pop

이 페이지의 내용