Computer >> 컴퓨터 >  >> 프로그래밍 >> MongoDB

MongoDB 컬렉션에서 ID로 배열 요소를 검색하고 업데이트하는 방법

MongoDB에서 배열 내부의 특정 요소를 찾아 수정해야 하는 경우가 자주 발생합니다. 이럴 때 위치(Positional) $ 연산자를 사용하면 조건에 일치하는 배열 요소만 정확하게 업데이트할 수 있습니다. 이 글에서는 배열 요소를 ID로 검색하고 업데이트하는 전 과정을 실제 예제와 함께 단계별로 살펴보겠습니다.

1. 샘플 컬렉션 생성

먼저 insertOne() 메서드를 사용하여 배열 필드를 포함한 문서를 저장할 컬렉션을 생성합니다. 아래 예제에서는 여러 과목 정보를 담은 Details 배열을 포함하는 문서를 만듭니다.

> db.demo49.insertOne(
... {
... 
...    "Name": "David",
...    "Details": [
...       {
...          "_id": "D1234",
...          "Subject":"MySQL"
...       },
...       {
...          "_id": "E234",
...          "Subject":"Java"
...       },
...       {
...          "_id": "F456",
...          "Subject":"Python"
...       }
...    ]
... }
... );
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e270a77cfb11e5c34d89902")
}

컬렉션이 정상적으로 생성되면 acknowledged: true와 함께 삽입된 문서의 ObjectId가 반환됩니다.

2. 저장된 문서 확인하기

find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.

> db.demo49.find();

위 쿼리를 실행하면 다음과 같은 출력 결과를 확인할 수 있습니다.

{ "_id" : ObjectId("5e270a77cfb11e5c34d89902"), "Name" : "David", "Details" : [ { "_id" : "D1234", "Subject" : "MySQL" }, { "_id" : "E234", "Subject" : "Java" }, { "_id" : "F456", "Subject" : "Python" } ] }

3. 위치 $ 연산자로 배열 요소 검색 및 업데이트

이제 핵심 단계입니다. Details 배열 중 _idE234인 요소를 찾아 해당 요소의 Subject 값을 변경해 보겠습니다. 이때 쿼리 조건으로 배열 요소를 특정하고, 업데이트 부분에서는 $ 위치 연산자를 사용합니다.

> db.demo49.update( {"Details._id":"E234"},
... {$set:{"Details.$.Subject":"MongoDB"}}, false, true )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

실행 결과를 보면 nMatched: 1, nModified: 1이 반환되었는데, 이는 하나의 문서가 조건과 일치했고 해당 문서가 성공적으로 수정되었다는 의미입니다. 여기서 $ 연산자는 쿼리 조건("Details._id":"E234")에 일치한 배열 요소의 인덱스를 자동으로 가리키므로, 별도의 인덱스 번호를 지정하지 않아도 됩니다.

4. 업데이트 결과 검증하기

수정이 제대로 적용되었는지 다시 한번 find() 메서드로 문서를 조회해 보겠습니다.

> db.demo49.find();

출력 결과를 확인하면 _idE234인 배열 요소의 Subject 값이 Java에서 MongoDB로 변경된 것을 알 수 있습니다.

{ "_id" : ObjectId("5e270a77cfb11e5c34d89902"), "Name" : "David", "Details" : [ { "_id" : "D1234", "Subject" : "MySQL" }, { "_id" : "E234", "Subject" : "MongoDB" }, { "_id" : "F456", "Subject" : "Python" } ] }

마무리

이처럼 MongoDB의 위치 $ 연산자를 활용하면 배열 안의 특정 요소를 ID나 기타 조건으로 손쉽게 찾아 업데이트할 수 있습니다. 참고로 최신 버전의 MongoDB에서는 update() 대신 updateOne() 또는 updateMany() 사용이 권장되며, 동작 방식은 동일하게 적용됩니다. 배열 데이터를 다루는 애플리케이션 개발 시 이 패턴을 잘 활용하면 코드를 더 간결하고 효율적으로 작성할 수 있습니다.