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

KUKJIN LEE's profile picture

KUKJIN LEE1개월 전 작성

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 });
  }
}

New Tech Posts