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

MongoDB에서 배열 내 태그를 업데이트하는 쿼리 작성법

MongoDB에서 문서 안의 태그(tag) 정보를 수정하려면 update() 명령어를 사용하면 됩니다. 특히 배열 형태로 저장된 요소를 수정할 때는 위치 연산자($)를 활용하는 것이 핵심입니다. 이번 글에서는 실제 예제를 통해 태그 배열의 특정 요소를 업데이트하는 과정을 단계별로 살펴보겠습니다.

1. 컬렉션 생성 및 문서 삽입

먼저 insertOne() 메서드를 사용해 태그 배열을 포함한 문서를 컬렉션에 삽입합니다.

> db.demo713.insertOne(
... {
... tags:
...     [
...       {
...          id:101,
...          Name:"Tag-1"
...       },
...       {
...          id:102,
...          Name:"Tag-3"
...       },
...       {
...          id:103,
...          Name:"Tag-3"
...       }
...     ]
... }
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5ea8625a5d33e20ed1097b87")
}

2. 삽입된 문서 확인하기

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

> db.demo713.find();

실행 결과는 다음과 같습니다.

{ "_id" : ObjectId("5ea8625a5d33e20ed1097b87"), "tags" : [ { "id" : 101, "Name" : "Tag-1" }, {
"id" : 102, "Name" : "Tag-3" }, { "id" : 103, "Name" : "Tag-3" } ] }

3. 위치 연산자($)로 태그 업데이트하기

이제 id가 102인 태그의 이름을 "Tag-2"로 변경해 보겠습니다. 이때 tags.$.Name처럼 위치 연산자($)를 사용하면, 조건에 일치하는 배열 요소만 정확히 찾아 수정할 수 있습니다.

> db.demo713.update({"tags.id":102},{$set:{"tags.$.Name":"Tag-2"}},false,true);
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

쿼리 파라미터 설명:

  • 첫 번째 인수 {"tags.id":102}: 수정할 대상을 찾기 위한 조건입니다.
  • 두 번째 인수 {$set:{"tags.$.Name":"Tag-2"}}: 일치하는 배열 요소의 Name 필드를 새 값으로 설정합니다.
  • 세 번째 인수 false: upsert 옵션으로, 조건에 맞는 문서가 없을 경우 새로 생성하지 않습니다.
  • 네 번째 인수 true: multi 옵션으로, 조건에 일치하는 모든 문서에 업데이트를 적용합니다.

결과 메시지에서 nModified : 1이 표시되면 하나의 문서가 성공적으로 수정된 것입니다.

4. 업데이트 결과 검증

다시 find().pretty() 메서드로 문서를 조회해 변경 사항을 확인합니다.

> db.demo713.find().pretty();

출력 결과를 보면 id가 102인 태그의 이름이 "Tag-3"에서 "Tag-2"로 정상적으로 변경된 것을 확인할 수 있습니다.

{
    "_id" : ObjectId("5ea8625a5d33e20ed1097b87"),
    "tags" : [
       {
          "id" : 101,
          "Name" : "Tag-1"
       },
       {
          "id" : 102,
          "Name" : "Tag-2"
       },
       {
          "id" : 103,
          "Name" : "Tag-3"
       }
    ]
}

정리

MongoDB에서 배열 내부의 특정 요소를 수정할 때는 update() 명령어와 함께 $set 연산자, 그리고 위치 연산자($)를 조합하면 됩니다. 참고로 최신 MongoDB 버전(4.2 이상)에서는 updateOne(), updateMany() 같은 메서드 사용이 권장되며, 동작 원리는 동일합니다.