MongoDB 문서 수정하기 예시 (updateOne, updateMany, replaceOne)
KUKJIN LEE • 1개월 전 작성
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 });
}
}