MongoDB 레코드 업데이트

MongoDBBeginner
지금 연습하기

소개

이 랩에서는 MongoDB 컬렉션의 문서를 업데이트하는 방법을 배웁니다. 먼저 updateOne() 메서드를 사용하여 단일 문서를 수정합니다. 그런 다음 updateMany() 메서드를 사용하여 여러 문서를 한 번에 수정하는 방법을 배웁니다. 또한 $set, $inc, $unset과 같은 다양한 업데이트 연산자를 사용하여 특정 수정을 수행합니다. 마지막으로 기존 문서를 업데이트하거나 존재하지 않는 경우 새 문서를 생성할 수 있는 upsert 옵션을 살펴봅니다. 이 랩은 MongoDB 에서 기본적인 데이터 조작 기술을 익히기 위한 실용적이고 직접적인 접근 방식을 제공합니다.

updateOne 을 사용하여 단일 문서 업데이트

이 단계에서는 MongoDB 컬렉션의 단일 문서를 수정하는 방법을 배웁니다. updateOne() 메서드와 $set 연산자를 함께 사용하여 특정 문서의 필드 값을 변경합니다.

먼저 MongoDB Shell 을 열어 데이터베이스와 상호 작용합니다.

mongosh

쉘에 접속한 후, 준비된 mylab_database로 전환합니다.

use mylab_database

books 컬렉션의 현재 문서를 살펴보겠습니다. .pretty() 메서드는 출력을 더 읽기 쉽게 포맷합니다.

db.books.find().pretty();

세 개의 초기 도서 문서가 표시되어야 합니다. _id 값은 환경에 따라 고유합니다.

[
  {
    _id: ObjectId("..."),
    title: 'JavaScript Fundamentals',
    author: 'Mike Johnson',
    year: 2022,
    pages: 350
  },
  {
    _id: ObjectId("..."),
    title: 'Python Deep Dive',
    author: 'Sarah Williams',
    year: 2021,
    pages: 450
  },
  {
    _id: ObjectId("..."),
    title: 'Machine Learning Basics',
    author: 'John Doe',
    year: 2020,
    price: 39.99
  }
]

이제 "JavaScript Fundamentals" 책의 출판 연도를 2023으로 업데이트해 보겠습니다.

db.books.updateOne(
  { title: "JavaScript Fundamentals" },
  { $set: { year: 2023 } }
);

이 명령을 자세히 살펴보겠습니다.

  • updateOne(): 필터와 일치하는 첫 번째 문서를 찾아 업데이트하는 메서드입니다.
  • { title: "JavaScript Fundamentals" }: 이것은 필터 문서입니다. MongoDB 에 title 필드가 "JavaScript Fundamentals"인 문서를 찾도록 지시합니다.
  • { $set: { year: 2023 } }: 이것은 업데이트 문서입니다. $set 연산자는 year 필드의 값을 2023으로 바꿉니다.

이 명령은 작업을 확인하는 결과 객체를 반환합니다.

{
  "acknowledged": true,
  "insertedId": null,
  "matchedCount": 1,
  "modifiedCount": 1,
  "upsertedCount": 0
}

matchedCount: 1은 필터와 일치하는 문서가 하나임을 나타내고, modifiedCount: 1은 문서 하나가 성공적으로 업데이트되었음을 나타냅니다.

변경 사항을 확인하려면 문서를 다시 찾습니다.

db.books.findOne({ title: "JavaScript Fundamentals" });

출력에는 새 연도로 업데이트된 문서가 표시됩니다.

{
  _id: ObjectId("..."),
  title: 'JavaScript Fundamentals',
  author: 'Mike Johnson',
  year: 2023,
  pages: 350
}

updateMany 을 사용하여 여러 문서 업데이트

때로는 여러 문서를 한 번에 업데이트해야 할 때가 있습니다. 이를 위해 MongoDB 는 updateMany() 메서드를 제공합니다. 이 단계에서는 특정 연도 이전에 출판된 모든 책에 새 필드를 추가합니다.

2022 년 이전에 출판된 모든 책에 "Classic" 값을 가진 status 필드를 추가해 보겠습니다.

db.books.updateMany({ year: { $lt: 2022 } }, { $set: { status: "Classic" } });

명령에 대한 설명은 다음과 같습니다.

  • updateMany(): 지정된 필터와 일치하는 모든 문서를 업데이트하는 메서드입니다.
  • { year: { $lt: 2022 } }: 이 필터는 year2022보다 작은 문서를 선택합니다. $lt 연산자는 "less than"(미만) 을 의미합니다.
  • { $set: { status: "Classic" } }: 이 업데이트 문서는 일치하는 모든 문서에 "Classic" 값을 가진 새 필드 status를 추가합니다.

출력에는 몇 개의 문서가 일치하고 수정되었는지 표시됩니다. 이 경우 두 권의 책이 2022 년 이전에 출판되었습니다.

{
  "acknowledged": true,
  "insertedId": null,
  "matchedCount": 2,
  "modifiedCount": 2,
  "upsertedCount": 0
}

두 문서가 모두 업데이트되었는지 확인하려면 상태가 "Classic"인 모든 책을 쿼리할 수 있습니다.

db.books.find({ status: "Classic" }).pretty();

이제 status 필드가 포함된 두 권의 책을 볼 수 있습니다.

[
  {
    _id: ObjectId("..."),
    title: 'Python Deep Dive',
    author: 'Sarah Williams',
    year: 2021,
    pages: 450,
    status: 'Classic'
  },
  {
    _id: ObjectId("..."),
    title: 'Machine Learning Basics',
    author: 'John Doe',
    year: 2020,
    price: 39.99,
    status: 'Classic'
  }
]

더 많은 업데이트 연산자 사용: $inc$unset

MongoDB 는 다양한 종류의 업데이트를 위한 여러 연산자를 제공합니다. 이 단계에서는 $inc를 사용하여 숫자 값을 수정하고 $unset을 사용하여 문서에서 필드를 제거하는 방법을 배웁니다.

먼저 $inc 연산자를 사용하여 "Python Deep Dive" 책의 페이지 수를 50 증가시키겠습니다. $inc 연산자는 지정된 값만큼 필드를 증가시킵니다.

db.books.updateOne({ title: "Python Deep Dive" }, { $inc: { pages: 50 } });

변경 사항을 확인하려면 문서를 검색합니다.

db.books.findOne({ title: "Python Deep Dive" });

pages 필드는 이제 500 (450 + 50) 이 되어야 합니다.

{
  _id: ObjectId("..."),
  title: 'Python Deep Dive',
  author: 'Sarah Williams',
  year: 2021,
  pages: 500,
  status: 'Classic'
}

다음으로 "Machine Learning Basics" 문서에서 price 필드를 제거해 보겠습니다. $unset 연산자는 특정 필드를 삭제합니다. $unset에 제공된 값 (이 경우 "") 은 중요하지 않으며 어떤 값이든 될 수 있습니다.

db.books.updateOne(
  { title: "Machine Learning Basics" },
  { $unset: { price: "" } }
);

price 필드가 제거되었는지 확인해 보겠습니다.

db.books.findOne({ title: "Machine Learning Basics" });

출력에는 price 필드가 없는 문서가 표시됩니다.

{
  _id: ObjectId("..."),
  title: 'Machine Learning Basics',
  author: 'John Doe',
  year: 2020,
  status: 'Classic'
}

upsert 를 사용한 문서 생성

"Upsert"는 문서가 존재하면 업데이트하고 존재하지 않으면 새로 삽입하는 특수한 유형의 업데이트 작업입니다. 이는 별도의 "확인 후 삽입 (check-then-insert)" 로직을 피하는 데 유용하며 데이터베이스 작업의 원자성 (atomicity) 을 보장합니다. Upsert 는 다음과 같은 시나리오에서 특히 유용합니다.

  • 데이터 일관성 보장: 문서 존재 여부를 먼저 확인한 다음 삽입 또는 업데이트를 결정하는 대신, 두 경우를 모두 원자적으로 처리하는 단일 작업을 수행할 수 있습니다.
  • 동시 작업 처리: 다중 사용자 환경에서 upsert 는 확인 작업과 삽입 작업 사이에 다른 프로세스가 동일한 문서를 삽입하는 경쟁 조건 (race condition) 을 방지합니다.
  • 애플리케이션 로직 단순화: 애플리케이션 코드에서 복잡한 조건부 로직의 필요성을 줄여 유지 관리가 용이하고 오류 발생 가능성이 낮아집니다.

업데이트 명령에 upsert: true 옵션을 추가하여 이러한 동작을 활성화할 수 있습니다.

새 책인 "Cloud Computing Essentials"를 추가해 보겠습니다. 이 책이 컬렉션에 존재하지 않으므로 upsert 작업이 이 책을 생성합니다.

db.books.updateOne(
  { title: "Cloud Computing Essentials" },
  { $set: { author: "David Lee", year: 2023, pages: 300 } },
  { upsert: true }
);

이 명령은 세 부분으로 구성됩니다.

  1. 필터: { title: "Cloud Computing Essentials" }
  2. 업데이트: { $set: { ... } }
  3. 옵션: { upsert: true }

필터와 일치하는 문서가 없었기 때문에 새 문서가 생성되었습니다. 결과 객체는 upsertedId를 포함하여 이를 반영합니다.

{
  acknowledged: true,
  matchedCount: 0,
  modifiedCount: 0,
  upsertedCount: 1,
  upsertedId: ObjectId("...")
}

이제 동일한 명령을 다시 실행해 보겠습니다. 이번에는 방금 생성한 문서를 MongoDB 가 찾아 업데이트할 것입니다.

db.books.updateOne(
  { title: "Cloud Computing Essentials" },
  { $set: { author: "David Lee", year: 2023, pages: 300 } },
  { upsert: true }
);

결과는 이제 matchedCount: 1을 보여줍니다. 설정하려는 데이터가 기존 데이터와 동일하므로 modifiedCount0입니다. 값을 변경했다면 modifiedCount1이 되었을 것입니다.

{
  "acknowledged": true,
  "insertedId": null,
  "matchedCount": 1,
  "modifiedCount": 0,
  "upsertedCount": 0
}

새 책이 컬렉션에 존재하는지 확인할 수 있습니다.

db.books.findOne({ title: "Cloud Computing Essentials" });

출력에는 새로 생성된 문서가 표시됩니다.

{
  _id: ObjectId("..."),
  title: 'Cloud Computing Essentials',
  author: 'David Lee',
  year: 2023,
  pages: 300
}

작업이 끝나면 MongoDB Shell 을 종료할 수 있습니다.

exit;

요약

이 실습에서는 MongoDB 에서 문서를 업데이트하는 필수 기술을 배웠습니다. updateOne을 사용하여 단일 문서를 수정하고 updateMany를 사용하여 여러 문서를 수정하는 연습을 했습니다. 또한 필드 값을 변경하는 $set, 숫자를 증가시키는 $inc, 필드를 제거하는 $unset을 포함한 강력한 업데이트 연산자를 살펴보았습니다. 마지막으로 문서가 존재하지 않으면 생성하는 upsert 옵션 사용법을 배웠습니다. 이러한 기술은 모든 MongoDB 애플리케이션에서 데이터를 관리하고 유지 관리하는 데 기본이 됩니다.