MongoDB에서 하위 컬렉션 업데이트하기 – $push와 점 표기법 활용
MongoDB에서 중첩된 문서(하위 컬렉션) 내부의 데이터를 수정하려면 update() 메서드를 사용하면 됩니다. $push 연산자로 지정한 값을 배열 끝에 추가하고, 점 표기법(dot notation)을 이용해 하위 필드까지 경로를 지정하면 한 번의 업데이트 작업으로 원하는 위치의 값을 손쉽게 변경할 수 있습니다.
1단계: 샘플 컬렉션 생성
먼저 테스트에 사용할 문서를 포함한 컬렉션을 생성합니다.
> db.demo547.insertOne(
... {
... Name : "Chris",
... Test :
... {
... "FirstTest" :
... {
... Scores: [56,29,76]
... },
... "SecondTest" :
... {
... Scores: [98,91,78]
... }
... }
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e8e2d579e5f92834d7f05dd")
}
2단계: 문서 조회
find() 메서드를 사용해 컬렉션의 모든 문서를 확인합니다.
> db.demo547.find();
위 명령은 다음과 같은 결과를 출력합니다.
{ "_id" : ObjectId("5e8e2d579e5f92834d7f05dd"), "Name" : "Chris", "Test" : { "FirstTest" : { "Scores" : [ 56, 29, 76 ] }, "SecondTest" : { "Scores" : [ 98, 91, 78 ] } } }3단계: 하위 컬렉션 업데이트 쿼리 실행
다음은 점 표기법으로 Test.FirstTest.Scores 경로에 접근한 뒤, $push 연산자를 사용해 값 99를 배열에 추가하는 쿼리입니다.
> db.demo547.update({"Name":"Chris"}, { $push:{ "Test.FirstTest.Scores" : 99}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })실행 결과에서 nModified가 1로 표시되는데, 이는 하나의 문서가 성공적으로 수정되었음을 의미합니다.
4단계: 업데이트 결과 확인
다시 find() 메서드로 문서를 조회해 변경 사항을 확인합니다.
> db.demo547.find();
출력 결과를 보면 FirstTest의 Scores 배열 끝에 99가 추가된 것을 확인할 수 있습니다.
{ "_id" : ObjectId("5e8e2d579e5f92834d7f05dd"), "Name" : "Chris", "Test" : { "FirstTest" : { "Scores" : [ 56, 29, 76, 99 ] }, "SecondTest" : { "Scores" : [ 98, 91, 78 ] } } }참고 사항
MongoDB 최신 버전에서는 기존의 update() 대신 updateOne() 또는 updateMany() 사용이 권장됩니다. 동작 방식은 동일하며, 조건에 일치하는 여러 문서를 한 번에 수정해야 할 경우 updateMany()를 사용하면 됩니다. 또한 $push 외에도 $addToSet(중복 없이 추가), $set(값 덮어쓰기) 등의 연산자를 상황에 맞게 활용하면 더욱 유연한 업데이트가 가능합니다.