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

MongoDB에서 배열의 값을 변경하는 쿼리 사용법 ($set 연산자)

MongoDB에서 배열 내부의 특정 값을 다른 값으로 교체하려면 $set 연산자와 위치 연산자($)를 함께 사용하면 됩니다. 이 글에서는 실제 예제를 통해 배열 요소를 업데이트하는 방법을 단계별로 살펴보겠습니다.

1. 샘플 컬렉션 생성하기

먼저 문서가 포함된 컬렉션을 생성합니다. 아래 예제에서는 학생 점수 배열을 가진 두 개의 문서를 삽입합니다.

> db.replaceValueInArrayDemo.insertOne({"StudentScores":[45,56,78]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cd7f0421a844af18acdffb7")
}
> db.replaceValueInArrayDemo.insertOne({"StudentScores":[33,90,67]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cd7f0521a844af18acdffb8")
}

2. 저장된 문서 확인하기

find() 메서드를 사용해 컬렉션의 모든 문서를 조회합니다.

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

위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.

{
   "_id" : ObjectId("5cd7f0421a844af18acdffb7"),
   "StudentScores" : [
      45,
      56,
      78
   ]
}
{
   "_id" : ObjectId("5cd7f0521a844af18acdffb8"),
   "StudentScores" : [
      33,
      90,
      67
   ]
}

3. $set으로 배열 값 교체하기

이제 첫 번째 문서의 StudentScores 배열에서 값 4599로 변경해 보겠습니다. 핵심은 쿼리 조건에 일치하는 배열 요소를 가리키는 위치 연산자 $를 활용하는 것입니다.

> db.replaceValueInArrayDemo.update({_id: ObjectId("5cd7f0421a844af18acdffb7"), StudentScores:45}, {$set: {'StudentScores.$': 99}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

실행 결과 nModified가 1로 표시되며, 하나의 문서가 성공적으로 수정되었음을 확인할 수 있습니다.

동작 원리

  • 쿼리 조건부: _id와 함께 StudentScores: 45 조건을 지정하여 변경 대상이 되는 배열 요소를 찾습니다.
  • $set 연산자: 'StudentScores.$' 필드 경로에서 $는 쿼리 조건과 일치한 첫 번째 배열 요소의 위치를 나타냅니다.
  • 주의 사항: 쿼리 조건에 해당 배열 값을 포함하지 않으면 위치 연산자를 사용할 수 없으므로 반드시 함께 작성해야 합니다.

4. 변경 결과 확인하기

문서를 다시 한번 조회하여 값이 정상적으로 교체되었는지 확인합니다.

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

출력 결과를 보면 첫 번째 문서의 배열 첫 번째 요소가 45에서 99로 변경된 것을 알 수 있습니다.

{
   "_id" : ObjectId("5cd7f0421a844af18acdffb7"),
   "StudentScores" : [
      99,
      56,
      78
   ]
}
{
   "_id" : ObjectId("5cd7f0521a844af18acdffb8"),
   "StudentScores" : [
      33,
      90,
      67
   ]
}

마무리

이처럼 MongoDB에서는 $set 연산자와 위치 연산자 $를 조합하면 배열 내 특정 값을 간단하게 교체할 수 있습니다. 참고로 MongoDB 4.2 이상에서는 updateOne() 메서드 사용이 권장되며, 여러 개의 일치하는 요소를 모두 변경하고 싶다면 all positional operator인 $[] 또는 filtered positional operator인 $[identifier]를 활용하는 것도 좋은 방법입니다.