MongoDB에서 배열 내 특정 인덱스에 위치한 객체를 수정하려면 update() 메서드를 사용하면 됩니다. 점(.) 표기법으로 배열 경로와 인덱스 번호를 지정하면 원하는 위치의 값만 정확하게 변경할 수 있습니다.
이번 글에서는 중첩 배열 구조를 가진 컬렉션을 만들고, 특정 인덱스의 객체 값을 업데이트한 뒤 결과를 확인하는 과정을 단계별로 살펴보겠습니다.
1. 테스트용 컬렉션 생성
먼저 insertOne() 메서드를 사용하여 문서가 포함된 컬렉션을 생성합니다. 이 예제에서는 학생 이름 정보를 담은 중첩 배열 구조를 사용합니다.
> db.updateObjectDemo.insertOne(
... {
... id : 101,
... "StudentDetails":
... [
... [
... {
... "StudentName": "John"
... },
... { "StudentName": "Chris" }
... ],
... [ { "StudentName": "Carol" },
... { "StudentName": "David" } ]
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5ccdcd9b685b30d09a7111e0")
}2. 저장된 문서 확인하기
find() 메서드를 사용하여 컬렉션의 모든 문서를 조회해 보겠습니다.
> db.updateObjectDemo.find().pretty();
위 쿼리를 실행하면 다음과 같은 출력 결과를 확인할 수 있습니다.
{
"_id" : ObjectId("5ccdcd9b685b30d09a7111e0"),
"id" : 101,
"StudentDetails" : [
[
{
"StudentName" : "John"
},
{
"StudentName" : "Chris"
}
],
[
{
"StudentName" : "Carol"
},
{
"StudentName" : "David"
}
]
]
}3. 특정 배열 인덱스의 객체 업데이트
이제 MongoDB에서 특정 배열 인덱스에 있는 객체를 업데이트하는 방법을 알아보겠습니다. 핵심은 $set 연산자와 함께 필드명.인덱스번호.필드명 형태의 경로를 지정하는 것입니다.
예를 들어 두 번째 배열([1])의 두 번째 요소([1]), 즉 인덱스 [1][1] 위치에 있는 "David"라는 이름을 "Mike"로 변경하려면 다음과 같이 작성합니다.
> db.updateObjectDemo.update({"id":101},{$set:{"StudentDetails.1.1.StudentName":"Mike"}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })실행 결과에서 nModified가 1로 표시되면 하나의 문서가 성공적으로 수정되었다는 의미입니다.
4. 업데이트 결과 검증
인덱스 [1][1] 위치의 객체가 실제로 "David"에서 "Mike"로 변경되었는지 find() 메서드로 확인해 보겠습니다.
> db.updateObjectDemo.find().pretty();
출력 결과는 다음과 같습니다.
{
"_id" : ObjectId("5ccdcd9b685b30d09a7111e0"),
"id" : 101,
"StudentDetails" : [
[
{
"StudentName" : "John"
},
{
"StudentName" : "Chris"
}
],
[
{
"StudentName" : "Carol"
},
{
"StudentName" : "Mike"
}
]
]
}위 결과를 보면 StudentDetails 배열의 인덱스 [1][1]에 있던 "David"가 "Mike"로 성공적으로 변경된 것을 확인할 수 있습니다.
정리
MongoDB에서 배열의 특정 위치에 있는 객체를 업데이트하는 방법을 정리하면 다음과 같습니다.
- update() 메서드와 $set 연산자를 함께 사용합니다.
- 업데이트할 필드 경로를 배열명.인덱스.필드명 형식으로 지정합니다(예: StudentDetails.1.1.StudentName).
- 배열 인덱스는 0부터 시작하므로 원하는 위치를 정확히 계산해야 합니다.
참고로 최신 MongoDB 버전에서는 update() 대신 updateOne(), updateMany() 메서드 사용이 권장됩니다. 이들 메서드도 동일한 점 표기법으로 특정 배열 인덱스의 값을 수정할 수 있습니다.