지금까지 배운 내용 중 firestore DB에서 문서를 수정하는 방법은 크게 세 가지가 존재한다. set()과 update(), batch()에 대해 알아보자.
set()은 문서가 기존에 존재했다면 전체를 덮어쓰기 하고, 존재하지 않았다면 문서를 새로 생성한다.
예시)
await db.collection("users").doc("alice").set({
name: "Alice",
age: 30
});
-> id='alice'인 문서가 없으면 새로 생성하여 데이터를 초기화하고,
이미 존재하면 set 메서드의 인수 데이터로 덮어쓴다.
update()은 문서가 기존에 존재하는 경우에만 사용이 가능하다.
await db.collection("users").doc("alice").update({
age: 31
});
-> 필드 age의 값을 31로 변경한다. 만약 age라는 이름의 필드가 없다면, 추가 후 값을 초기화한다.
await db.collection('users').doc('userId123').delete();
firestore는 대규모 데이터 손실을 방지하기 위해, 명령어 한 줄로 컬렉션을 삭제하는 방법은 제공하고 있지 않다.
따라서 컬렉션을 삭제하려면 그 컬렉션에 있는 모든 문서를 하나씩 삭제해야 한다.
batch는 문서를 읽을 필요가 없는 경우, 일괄 쓰기를 할 때 사용한다.
set(), update() 또는 delete()를 포함하며, batch.commit()을 통해 일괄 처리한다. 다음 코드를 보자.
const items = rankingData.boxofs.boxof;
const concertsCollectionRef = docRef.collection("concerts");
const batch = db.batch();
// 랭킹 데이터 추가
items.forEach((concert) => {
const concertDocRef = concertsCollectionRef.doc();
batch.set(concertDocRef, concert);
});
await batch.commit();
이는 id='concerts'인 컬렉션에 items 배열 안의 데이터들을 각각 하나의 문서로 추가하는 코드이다.
db.batch()로 쓰기 작업 묶음을 새로 만든 뒤, batch.set()을 통해 set작업을 batch에 추가한다. 이 때 batch.set()의 첫 번째 인자로는 문서id가, 두 번째 인자로는 쓸 데이터가 들어간다. 마지막에 batch.commit()을 통해 batch 안에 추가된 모든 set 작업을 한꺼번에 실행한다.
1. 원자적(atomic) 처리
2. 성능 향상
3. 오프라인 지원
한 번 batch.commit()을 호출하면, 해당 batch는 종료되고 더 이상 사용이 불가능해진다.
따라서 새로운 일괄 쓰기 작업이 있을 때마다 batch를 생성해주어야 한다.