mongodb 수정mongodb updateOnemongodb updateManymongodb replaceOnemongodb 예제

MongoDB 문서 수정하기 예시 (updateOne, updateMany, replaceOne)

KUKJIN LEE
KUKJIN LEE
2024년 10월 16일
286

MongoDB는 데이터를 업데이트할 때 여러 가지 메서드를 제공하여 유연하게 데이터 관리를 할 수 있습니다.

 

1. updateOne vs replaceOne: 기능 차이

  • updateOne: 문서의 일부 필드만 수정하고 나머지 필드는 유지.

  • replaceOne: 문서 전체를 새로운 문서로 교체

 

  • updateOne()

    • 부분 수정을 위한 메서드입니다.

    • 한 문서의 특정 필드를 수정하면서 나머지 필드는 그대로 유지합니다.

    • 예시: 특정 문서의 content 필드만 수정하고, 다른 필드는 그대로 입니다.

db.collection('kakao').updateOne(
  { title: '제목1' }, // 조건: title이 '제목1'인 문서
  { $set: { content: '업데이트된 내용' } } // 업데이트할 내용
);
  • replaceOne()

    • 전체 문서 교체를 위한 메서드입니다.

    • 기존 문서를 완전히 덮어씁니다. 즉, 교체되지 않은 필드는 삭제됩니다.

    • 예시: 특정 문서의 모든 필드를 새로운 값으로 대체됩니다.

db.collection('kakao').replaceOne(
  { title: '제목1' }, // 조건: title이 '제목1'인 문서
  { title: '새로운 제목', content: '새로운 내용' } // 교체할 새 문서
);

 

2. updateMany 사용 사례

updateMany()는 여러 문서를 한꺼번에 수정할 때 사용됩니다. 이는 대규모 데이터를 일괄 수정할 때 매우 유용합니다. 여러 문서를 한 번에 수정해야 하는 상황을 살펴보겠습니다.

사용 예시 1: 상태 일괄 변경

특정 조건에 맞는 다수의 문서의 상태를 일괄적으로 변경할 때 유용합니다.

db.collection('orders').updateMany(
  { status: 'pending' }, // 조건: status가 'pending'인 모든 문서
  { $set: { status: 'shipped' } } // 상태를 'shipped'로 업데이트
);
  • 예시 설명: status'pending'인 모든 주문 문서의 상태를 'shipped'로 변경.

사용 예시 2: 대량 할인 적용

여러 제품에 동일한 할인을 적용해야 할 때 유용합니다.

db.collection('products').updateMany(
  { category: 'electronics' }, // 조건: 전자 제품 카테고리의 모든 문서
  { $mul: { price: 0.9 } } // 가격을 10% 할인
);

3. API 구현 예제

Next.js에서 MongoDB 업데이트 API를 구현하는 방법을 살펴보겠습니다. 각 메서드를 사용하는 API를 별도로 구성합니다.

 

3.1 updateOne API 예제 (app/api/update-one/route.ts)

import { NextResponse } from 'next/server';
import clientPromise from '@/lib/mongodb';

export async function POST(request: Request) {
  try {
    const { title, content } = await request.json();

    const client = await clientPromise;
    const db = client.db();
    const collection = db.collection('kakao');

    const result = await collection.updateOne(
      { title: title }, // 조건: title이 일치하는 문서
      { $set: { content: content } } // 업데이트할 내용
    );

    return NextResponse.json({ success: true, modifiedCount: result.modifiedCount });
  } catch (error) {
    return NextResponse.json({ success: false, error: error.message });
  }
}

3.2 updateMany API 예제 (app/api/update-many/route.ts)

import { NextResponse } from 'next/server';
import clientPromise from '@/lib/mongodb';

export async function POST(request: Request) {
  try {
    const { status, newStatus } = await request.json();

    const client = await clientPromise;
    const db = client.db();
    const collection = db.collection('kakao');

    const result = await collection.updateMany(
      { status: status }, // 조건: status가 일치하는 모든 문서
      { $set: { status: newStatus } } // 업데이트할 내용
    );

    return NextResponse.json({ success: true, modifiedCount: result.modifiedCount });
  } catch (error) {
    return NextResponse.json({ success: false, error: error.message });
  }
}

3.3 replaceOne API 예제 (app/api/replace-one/route.ts)

import { NextResponse } from 'next/server';
import clientPromise from '@/lib/mongodb';

export async function POST(request: Request) {
  try {
    const { oldTitle, newTitle, newContent } = await request.json();

    const client = await clientPromise;
    const db = client.db();
    const collection = db.collection('kakao');

    const result = await collection.replaceOne(
      { title: oldTitle }, // 조건: oldTitle이 일치하는 문서
      { title: newTitle, content: newContent } // 교체할 새 문서
    );

    return NextResponse.json({ success: true, modifiedCount: result.modifiedCount });
  } catch (error) {
    return NextResponse.json({ success: false, error: error.message });
  }
}

관련 글

[SQL 입문] 필요한 데이터만 콕 집어 가져올 수 있는 WHERE 절

사용자는 테이블에 있는 모든 데이터를 다 보고 싶어 하지는 않습니다. 오히려 특정 항목에 대한 데이터만 가져오고 싶을 때가 훨씬 많습니다. 예를 들어, 어떤 사용자의 이메일이나 ID는 알고 있는데, 그 사람이 언제 우리 앱에 가입했는지 확인하고 싶다고 가정해 봅시다...

2026년 1월 27일10

SQL에서 SELECT란 무엇인가?

데이터베이스를 거대한 서류 보관함이라고 생각하면 됩니다. 보관함 안에는 수많은 데이터가 차곡차곡 쌓입니다. SELECT는 이 보관함에서 "내가 원하는 정보를 찾아줘!"라고 요청하는 명령어입니다. 이 과정을 전문 용어로 '쿼리(Query)'라고 부릅니다. &nbs...

2026년 1월 26일10

[SQL 기초] "언제 하나씩 다 넣어?" 데이터 한 번에 넣기

개발을 하다 보면 데이터베이스(DB)에 샘플 데이터를 대량으로 넣어야 할 때가 있습니다. 메뉴 100개를 추가해야 하는데 INSERT 문을 100번 쓰고 있다면? 너무 비효율적이죠! 오늘은 SQL에서 여러 데이터를 한 번에 넣는 '다중 삽입(Multiple Inse...

2026년 1월 21일13

SQL 데이터 삽입하기

데이터가 없는 데이터베이스는 연료 없는 로켓과 같습니다. 이제 'Missions' 테이블에 새로운 행(row)을 추가하는 방법을 알아보겠습니다. "삽입(Inserting)"은 '데이터 추가'를 의미합니다. 기존 Missions 테이블 ...

2026년 1월 20일12