MongoDB에서 배열 내부의 특정 요소를 다른 값으로 바꾸고 싶다면 위치 연산자(position operator)인 $를 사용하면 됩니다. 이 연산자는 쿼리 조건과 일치하는 배열 요소를 자동으로 가리켜 주기 때문에, 인덱스 번호를 직접 지정하지 않아도 원하는 위치의 값을 손쉽게 수정할 수 있습니다.
1. 샘플 컬렉션 생성하기
먼저 문서가 포함된 컬렉션을 하나 생성해 보겠습니다.
> db.replaceAnArrayFieldValueDemo.insertOne({"StudentTechnicalSubjects":["MySQL","SQL Server","PL/SQL"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cea41e0ef71edecf6a1f68f")
}2. 저장된 문서 확인하기
find() 메서드를 사용하면 컬렉션에 있는 모든 문서를 조회할 수 있습니다.
> db.replaceAnArrayFieldValueDemo.find().pretty();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{
"_id" : ObjectId("5cea41e0ef71edecf6a1f68f"),
"StudentTechnicalSubjects" : [
"MySQL",
"SQL Server",
"PL/SQL"
]
}3. $ 위치 연산자로 배열 값 교체하기
이제 배열 필드의 값을 교체해 보겠습니다. 여기서는 "SQL Server"를 "MongoDB"로 변경합니다. 핵심은 업데이트 조건에 변경하고자 하는 값("SQL Server")을 명시하고, $set 안에서 'StudentTechnicalSubjects.$'처럼 $ 기호를 사용해 일치하는 요소를 지정하는 것입니다.
> db.replaceAnArrayFieldValueDemo.update(
{"StudentTechnicalSubjects":"SQL Server"},
{ $set: { 'StudentTechnicalSubjects.$': "MongoDB" }}
);
WriteResult({ "nMatched" : 0, "nUpserted" : 0, "nModified" : 0 })4. 업데이트 결과 확인하기
업데이트가 정상적으로 적용되었는지 다시 한번 문서를 조회해 보겠습니다.
> db.replaceAnArrayFieldValueDemo.find().pretty();
실행 결과를 보면 "SQL Server"가 "MongoDB"로 성공적으로 교체된 것을 확인할 수 있습니다.
{
"_id" : ObjectId("5cea41e0ef71edecf6a1f68f"),
"StudentTechnicalSubjects" : [
"MySQL",
"MongoDB",
"PL/SQL"
]
}참고 사항
$ 위치 연산자는 반드시 update 쿼리의 조건(find 부분)에 해당 배열 필드가 포함되어 있어야만 동작합니다. 조건에 배열 값이 없으면 MongoDB는 어떤 요소를 가리켜야 할지 알 수 없어 에러가 발생합니다. 또한 최신 버전의 MongoDB에서는 update() 대신 updateOne(), updateMany() 같은 메서드를 사용하는 것이 권장됩니다.