MongoDB에서는 일반적인 업데이트 문법으로 필드의 기존 값을 그대로 참조해 새로운 값을 만들 수 없습니다. 대신 $set 연산자를 사용해야 하며, 기존 필드 값을 활용하려면 애그리게이션 파이프라인 업데이트를 함께 활용하는 것이 효과적입니다. 이 글에서는 예제를 통해 그 과정을 단계별로 살펴보겠습니다.
1. 예제 컬렉션 생성하기
먼저 demo256이라는 컬렉션을 만들고 문서를 삽입합니다.
> db.demo256.insertOne({"Name":"Chris"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e47a3e91627c0c63e7dba8b")
}
> db.demo256.insertOne({"Name":"Bob"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e47a3ea1627c0c63e7dba8c")
}
> db.demo256.insertOne({"Name":"David"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e47a3eb1627c0c63e7dba8d")
}2. 삽입된 문서 확인하기
find() 메서드를 사용하면 컬렉션의 모든 문서를 조회할 수 있습니다.
> db.demo256.find();
위 명령을 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : ObjectId("5e47a3e91627c0c63e7dba8b"), "Name" : "Chris" }
{ "_id" : ObjectId("5e47a3ea1627c0c63e7dba8c"), "Name" : "Bob" }
{ "_id" : ObjectId("5e47a3eb1627c0c63e7dba8d"), "Name" : "David" }3. $set 연산자로 필드 값 변경하기
$set 연산자를 사용하면 지정한 값으로 필드를 갱신할 수 있습니다. 다만 아래 예시처럼 문자열을 직접 지정하면 기존 값이 참조되는 것이 아니라 새 문자열로 단순히 덮어써진다는 점에 유의해야 합니다.
> db.demo256.update({}, {$set:{"Name":"Name" + " is a student"}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })업데이트 후 find() 메서드로 결과를 다시 확인해 보겠습니다.
> db.demo256.find();
{ "_id" : ObjectId("5e47a5301627c0c63e7dba8e"), "Name" : "Name is a student" }
{ "_id" : ObjectId("5e47a5311627c0c63e7dba8f"), "Name" : "Bob" }
{ "_id" : ObjectId("5e47a5311627c0c63e7dba90"), "Name" : "David" }위 결과에서 볼 수 있듯이, 일반 업데이트 방식에서는 "Name"이라는 문자열이 필드의 기존 값이 아니라 단순한 리터럴로 처리되어 첫 번째 문서만 "Name is a student"로 변경되었습니다.
4. 기존 값을 활용한 업데이트 (권장 방법)
필드의 기존 값을 그대로 활용해 업데이트하려면 MongoDB 4.2부터 지원되는 애그리게이션 파이프라인 업데이트와 $concat 연산자를 사용하는 것이 좋습니다.
> db.demo256.updateMany({}, [
... { $set: { Name: { $concat: ["$Name", " is a student"] } } }
... ]);
{ "acknowledged" : true, "matchedCount" : 3, "modifiedCount" : 3 }이 방식을 사용하면 "$Name"으로 기존 필드 값을 참조할 수 있으므로, 모든 문서의 Name 필드가 기존 값 뒤에 " is a student"가 붙은 형태로 갱신됩니다.
{ "_id" : ObjectId("..."), "Name" : "Chris is a student" }
{ "_id" : ObjectId("..."), "Name" : "Bob is a student" }
{ "_id" : ObjectId("..."), "Name" : "David is a student" }정리
MongoDB에서 필드 자신의 값을 기반으로 업데이트하려면 단순 문자열 결합이 아닌, $set 연산자와 애그리게이션 파이프라인($concat 등)을 조합해야 합니다. 이 방법을 사용하면 기존 데이터를 안전하게 참조하면서 원하는 형태로 값을 변환할 수 있습니다.