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

MongoDB에서 배열 필드 값을 교체하는 방법 ($ 위치 연산자 활용)

MongoDB에서 배열 내부의 특정 요소를 다른 값으로 바꾸고 싶다면 위치 연산자(position operator)인 $를 사용하면 됩니다. 이 연산자는 쿼리 조건과 일치하는 배열 요소를 자동으로 가리켜 주기 때문에, 인덱스 번호를 직접 지정하지 않아도 원하는 위치의 값을 손쉽게 수정할 수 있습니다.

1. 샘플 컬렉션 생성하기

먼저 문서가 포함된 컬렉션을 하나 생성해 보겠습니다.

> db.replaceAnArrayFieldValueDemo.insertOne({"StudentTechnicalSubjects":["MySQL","SQL Server","PL/SQL"]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cea41e0ef71edecf6a1f68f")
}

2. 저장된 문서 확인하기

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

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

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

{
   "_id" : ObjectId("5cea41e0ef71edecf6a1f68f"),
   "StudentTechnicalSubjects" : [
      "MySQL",
      "SQL Server",
      "PL/SQL"
   ]
}

3. $ 위치 연산자로 배열 값 교체하기

이제 배열 필드의 값을 교체해 보겠습니다. 여기서는 "SQL Server""MongoDB"로 변경합니다. 핵심은 업데이트 조건에 변경하고자 하는 값("SQL Server")을 명시하고, $set 안에서 'StudentTechnicalSubjects.$'처럼 $ 기호를 사용해 일치하는 요소를 지정하는 것입니다.

> db.replaceAnArrayFieldValueDemo.update(
   {"StudentTechnicalSubjects":"SQL Server"},
   { $set: { 'StudentTechnicalSubjects.$': "MongoDB" }}
);
WriteResult({ "nMatched" : 0, "nUpserted" : 0, "nModified" : 0 })

4. 업데이트 결과 확인하기

업데이트가 정상적으로 적용되었는지 다시 한번 문서를 조회해 보겠습니다.

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

실행 결과를 보면 "SQL Server"가 "MongoDB"로 성공적으로 교체된 것을 확인할 수 있습니다.

{
   "_id" : ObjectId("5cea41e0ef71edecf6a1f68f"),
   "StudentTechnicalSubjects" : [
      "MySQL",
      "MongoDB",
      "PL/SQL"
   ]
}

참고 사항

$ 위치 연산자는 반드시 update 쿼리의 조건(find 부분)에 해당 배열 필드가 포함되어 있어야만 동작합니다. 조건에 배열 값이 없으면 MongoDB는 어떤 요소를 가리켜야 할지 알 수 없어 에러가 발생합니다. 또한 최신 버전의 MongoDB에서는 update() 대신 updateOne(), updateMany() 같은 메서드를 사용하는 것이 권장됩니다.