MongoDB에서 내부(중첩) 배열에 데이터 삽입하기
MongoDB에서 문서 안에 중첩된 배열, 즉 내부 배열에 새로운 데이터를 추가하려면 $addToSet 연산자를 사용하면 됩니다. $addToSet은 배열에 값을 추가하지만, 이미 동일한 값이 존재하는 경우에는 중복 없이 한 번만 저장된다는 특징이 있습니다.
이 글에서는 실제 예제를 통해 내부 배열에 데이터를 삽입하는 전 과정을 단계별로 살펴보겠습니다.
1단계: 샘플 컬렉션 생성
먼저 insertOne() 메서드를 사용해 UserDetails 배열을 포함하는 문서로 컬렉션을 생성합니다.
> db.insertDataIntoArrayDemo.insertOne(
{
"UserDetails":[
{
"UserId" :"user121",
"userGroupMessage":[]
},
{
"UserId" :"user221",
"userGroupMessage":["Cool","Good Morning"]
}
]
}
);
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd694e157806ebf1256f128")
}2단계: 저장된 문서 조회하기
find() 메서드를 사용해 컬렉션의 모든 문서를 확인해 보겠습니다.
> db.insertDataIntoArrayDemo.find().pretty();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{
"_id" : ObjectId("5cd694e157806ebf1256f128"),
"UserDetails" : [
{
"UserId" : "user121",
"userGroupMessage" : [ ]
},
{
"UserId" : "user221",
"userGroupMessage" : [
"Cool",
"Good Morning"
]
}
]
}3단계: $addToSet으로 내부 배열에 값 추가하기
이제 update() 메서드와 함께 $addToSet 연산자, 그리고 위치 연산자($)를 조합하여 user121 사용자의 userGroupMessage 배열에 "Hello"라는 값을 추가해 보겠습니다.
> db.insertDataIntoArrayDemo.update({"UserDetails.UserId":"user121"},
{"$addToSet":{"UserDetails.$.userGroupMessage":"Hello"}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })여기서 핵심은 UserDetails.$ 부분입니다. 위치 연산자($)는 쿼리 조건(UserId가 user121인 요소)에 매칭된 배열 요소를 자동으로 가리키므로, 정확히 해당 위치의 내부 배열만 업데이트할 수 있습니다.
4단계: 업데이트 결과 확인
변경이 제대로 적용되었는지 다시 한번 find() 메서드로 문서를 조회해 보겠습니다.
> db.insertDataIntoArrayDemo.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5cd694e157806ebf1256f128"),
"UserDetails" : [
{
"UserId" : "user121",
"userGroupMessage" : [
"Hello"
]
},
{
"UserId" : "user221",
"userGroupMessage" : [
"Cool",
"Good Morning"
]
}
]
}출력 결과를 보면 user121의 userGroupMessage 배열에 "Hello"가 성공적으로 추가된 것을 확인할 수 있으며, 나머지 문서는 그대로 유지됩니다.
$addToSet 사용 시 주의사항
$addToSet은 중복 값을 허용하지 않는다는 점을 기억해야 합니다. 즉, 이미 배열에 존재하는 값을 다시 추가하려고 하면 아무런 변화가 일어나지 않습니다. 반면 중복 여부와 상관없이 무조건 값을 뒤에 추가하고 싶다면 $push 연산자를 사용하는 것이 적합합니다.