Computer >> 컴퓨터 >  >> 프로그래밍 >> MongoDB

MongoDB에서 중첩 배열(배열의 배열)에 $addToSet으로 값 추가하기

MongoDB $addToSet 개요

배열 안에 또 다른 배열이 있는 문서(중첩 배열)에 값을 추가하려면 update() 메서드와 $addToSet 연산자를 함께 사용하면 됩니다.

$addToSet 연산자는 지정한 값이 배열에 아직 존재하지 않을 때만 값을 추가합니다. 만약 값이 이미 배열에 있다면 $addToSet은 아무 작업도 수행하지 않으므로, 중복 없이 고유한 값만 유지해야 하는 경우에 매우 유용합니다.

테스트용 컬렉션 생성

먼저 insertOne() 메서드를 사용하여 문서가 포함된 컬렉션을 생성해 보겠습니다.

> db.demo509.insertOne(
... {
... "value1" : [
... {
... "value2" : [
... 76,
... 14,
... 56
... ]
... },
... {
... "value2" : [
... 12,
... 19,
... 91
... ]
... },
... {
... "value2" : [
... 87
... ]
... }
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e88421d987b6e0e9d18f57d")
}

문서 조회하기

find() 메서드를 사용하여 컬렉션의 모든 문서를 확인합니다.

> db.demo509.find();

실행 결과는 다음과 같습니다.

{ "_id" : ObjectId("5e88421d987b6e0e9d18f57d"), "value1" : [
{ "value2" : [ 76, 14, 56 ] },
{ "value2" : [ 12, 19, 91 ] }, { "value2" : [ 87 ] }
] }

$addToSet으로 중첩 배열에 값 추가

다음은 점 표기법(dot notation)으로 특정 위치의 내부 배열에 $addToSet을 적용하여 값을 추가하는 쿼리입니다. 여기서는 value1 배열의 세 번째 요소(index 2)에 있는 value2 배열에 1000을 추가합니다.

> db.demo509.update({},{$addToSet:{"value1.2.value2":1000}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

업데이트 후 find() 메서드로 모든 문서를 다시 조회해 보겠습니다.

> db.demo509.find();

결과를 보면 value1의 세 번째 객체에 있는 value2 배열에 1000이 성공적으로 추가된 것을 확인할 수 있습니다.

{ "_id" : ObjectId("5e88421d987b6e0e9d18f57d"), "value1" : [
{ "value2" : [ 76, 14, 56 ] },
{ "value2" : [ 12, 19, 91 ] }, { "value2" : [ 87, 1000 ] }
] }

이처럼 "필드명.인덱스.내부필드명" 형식의 경로와 $addToSet을 조합하면, 배열의 배열 구조에서도 원하는 내부 배열에 손쉽게 고유한 값을 추가할 수 있습니다.