MongoDB에서 배열 객체 업데이트하기
MongoDB에서 배열 안에 포함된 객체를 업데이트하려면 update() 메서드를 사용해야 합니다. 이때 점 표기법(dot notation)과 함께 위치 연산자($)를 활용하는 것이 핵심입니다.
먼저 문서가 담긴 컬렉션을 생성해 보겠습니다.
> db.demo489.insertOne(
... {
... details : [{
... id : 101,
... "Info1" : {
... "StudentName" : "Chris"
... },
... "Info2" : {
... "TeacherName" : "David"
... }
... },
... {
... id : 102,
... "Info1" : {
... "StudentName" : "Carol"
... },
... "Info2" : {
... "TeacherName" : "Mike"
... }
... }]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e8356e0b0f3fa88e22790ba")
}컬렉션의 문서 조회하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.
> db.demo489.find();
위 명령을 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : ObjectId("5e8356e0b0f3fa88e22790ba"), "details" : [ { "id" : 101, "Info1" : { "StudentName" : "Chris" }, "Info2" : { "TeacherName" : "David" } }, { "id" : 102, "Info1" : { "StudentName" : "Carol" }, "Info2" : { "TeacherName" : "Mike" } } ] }배열 객체를 업데이트하는 쿼리 작성
다음은 배열 내부의 객체를 업데이트하는 쿼리입니다.
> db.demo489.update({"details.id":102},
... {$set: {"details.$.Info1.StudentName":"Robert",
... "details.$.Info2.TeacherName":"John",
... "details.$.CountryName" : "US"
... }
... })
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })여기서 "details.$"에 사용된 $는 위치 연산자(positional operator)입니다. 쿼리 조건("details.id": 102)과 일치하는 첫 번째 배열 요소를 가리키며, 이를 통해 해당 요소의 Info1.StudentName과 Info2.TeacherName 값을 수정하고 새로운 필드인 CountryName까지 추가할 수 있습니다.
업데이트 결과 확인
업데이트가 완료되면 다시 find() 메서드로 변경된 문서를 확인합니다.
> db.demo489.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5e8356e0b0f3fa88e22790ba"),
"details" : [
{
"id" : 101,
"Info1" : {
"StudentName" : "Chris"
},
"Info2" : {
"TeacherName" : "David"
}
},
{
"id" : 102,
"Info1" : {
"StudentName" : "Robert"
},
"Info2" : {
"TeacherName" : "John"
},
"CountryName" : "US"
}
]
}결과를 보면 id: 102에 해당하는 배열 요소만 선택적으로 업데이트되었음을 확인할 수 있습니다. 학생 이름이 Robert로, 교사 이름이 John으로 변경되었고, 새로운 필드인 CountryName: "US"가 성공적으로 추가되었습니다. 반면 id: 101 요소는 기존 값 그대로 유지됩니다.