변수 인덱스로 MongoDB 배열 업데이트하기
MongoDB에서 문서 내 배열을 변수에 저장된 인덱스 값으로 업데이트하려면 아래 구문을 사용하면 됩니다. 여기서 yourIndexValue는 실제 인덱스 값을 의미하고, yourIndexVariableName은 그 인덱스를 담고 있는 변수 이름입니다.
var yourIndexVariableName = yourIndexValue,
anyVariableName = { "$set": {} };
yourVariableName["$set"]["yourFieldName." + yourIndexVariableName] = "yourValue";
db.yourCollectionName.update({ "_id": yourObjectId }, yourVariableName);
핵심은 $set 연산자 안에서 필드 이름 뒤에 점(.)과 변수 인덱스를 연결하여 "필드명.인덱스" 형태의 경로를 동적으로 만들어 주는 것입니다.
1단계: 테스트용 컬렉션 생성
먼저 문서가 포함된 컬렉션을 생성해 보겠습니다.
> db.updateByVariableDemo.insertOne({"StudentSubjects":["MySQL","Java","SQL Server","PL/SQL"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd553c37924bb85b3f4893a")
}2단계: 현재 문서 확인
find() 메서드를 사용하여 컬렉션의 모든 문서를 조회합니다.
> db.updateByVariableDemo.find().pretty();
위 쿼리는 다음과 같은 결과를 출력합니다.
{
"_id" : ObjectId("5cd553c37924bb85b3f4893a"),
"StudentSubjects" : [
"MySQL",
"Java",
"SQL Server",
"PL/SQL"
]
}3단계: 변수 인덱스로 배열 요소 업데이트
이제 변수에 담긴 인덱스 값을 이용해 배열의 특정 위치를 업데이트하는 쿼리를 실행해 보겠습니다. 여기서는 인덱스 1(두 번째 요소)의 값을 "Java"에서 "MongoDB"로 변경합니다.
> var indexValue = 1,
... valueToUpdate= { "$set": {} };
> valueToUpdate["$set"]["StudentSubjects."+indexValue] = "MongoDB";
MongoDB
> db.updateByVariableDemo.update({ "_id": ObjectId("5cd553c37924bb85b3f4893a") }, valueToUpdate)
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
nModified : 1이 출력되면 하나의 문서가 성공적으로 수정된 것입니다.
4단계: 업데이트 결과 확인
변경이 정상적으로 적용되었는지 문서를 다시 조회해 보겠습니다.
> db.updateByVariableDemo.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5cd553c37924bb85b3f4893a"),
"StudentSubjects" : [
"MySQL",
"MongoDB",
"SQL Server",
"PL/SQL"
]
}출력 결과를 보면 배열의 두 번째 요소가 "Java"에서 "MongoDB"로 성공적으로 변경된 것을 확인할 수 있습니다. 이처럼 변수 인덱스를 활용하면 런타임에 동적으로 결정되는 위치의 배열 요소도 손쉽게 업데이트할 수 있습니다.