MongoDB 레코드 업데이트

MongoDBBeginner
지금 연습하기

소개

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

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 초급 레벨의 실험이며 완료율은 90%입니다.학습자들로부터 99%의 긍정적인 리뷰율을 받았습니다.

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 애플리케이션에서 데이터를 관리하고 유지 관리하는 데 기본이 됩니다.