이 게시물 시리즈의 색인은 NgateSystems.com에 있습니다. 거기에서 매우 유용한 키워드 검색 기능도 찾을 수 있습니다.
최종 검토일: 2024년 11월
Firestore CRUD(생성, 읽기, 업데이트, 삭제) 지침에 대한 Google의 광범위한 온라인 문서는 일상적으로 사용하기에는 너무 자세할 수 있습니다. 다음은 가장 중요한 Firestore 기능을 위한 템플릿입니다. 그대로 잘라내어 붙여넣은 다음 변수 이름의 "my"라는 단어를 대상으로 하는 컬렉션 이름의 적절한 축약형으로 바꾸는 것이 좋습니다. 예를 들어 "Lecture_events"라는 컬렉션에 대한 참조는 "lecEvtsCollRef"로 코딩될 수 있습니다.
자동 생성 ID가 있는 myDocData 개체가 포함된 문서를 생성하려면:
let myDocData = .... create an object containing your data item properties ..... const myCollRef = collection(db, "myCollectionName"); const myDocRef = doc(myCollRef); await setDoc(myDocRef, myDocData);
혼란스럽게도 '데이터 추가'에 대한 Google 문서에서는 setDoc 대신 addDoc 함수를 참조합니다. setDocis가 선호되는 이유에 대한 조언은 아래 포스트스크립트를 참조하세요.
위의 코드 조각에서 myDocRef= 문은 자동 ID가 할당되는 지점입니다. 할당된 값을 찾아야 하는 경우 myDocRef.id에서 찾을 수 있습니다. 이 점에 대한 자세한 내용은 아래 포스트스크립트를 다시 참조하세요.
데이터 항목을 식별자로 사용하여 문서를 생성하려면:
let myDocData = .... create a data object ..... let myDocumentIdentifier = .... create your identifier .... const myDocRef = doc(db, "myCollectionName", myDocumentIdentifier) await setDoc(myDocRef, myDocData);
문서 ID를 사용하여 개별 문서를 검색하려면:
const myDocRef = doc(db, "myCollectionName", myDocId); const myDoc = await getDoc(myDocRef); if (myDoc.exists()) { console.log("Document data:", myDoc.data()); }
선택 및 정렬 기준에 따라 선택 문서를 검색하려면(예):
const myCollRef = collection(db, "myCollectionName"); const myQuery = query(myCollRef, where("myField1Name", "==", myField1Value), orderBy("myField2Name", "asc")); const mySnapshot = await getDocs(myQuery); mySnapshot.forEach((myDoc) => { console.log(myDoc.id, " => ", myDoc.data()); });
스냅샷의 forEach 내에서 문서의 데이터는 myDoc.data()로 사용할 수 있으며, 문서의 docRef는 myDoc.ref이고 해당 docId는 myDoc.id입니다. 선택 기준과 일치하는 문서의 존재를 확인하는 데 관심이 있는 경우 유용한 방법은 0이 아닌 mySnapshot.size를 확인하는 것입니다.
스냅샷 배열의 개별 문서를 참조하려는 경우 mySnapshot.docs[n].data()에서 n번째 항목에 대한 데이터를 찾고 mySnapshot.docs[n]에서 해당 ID를 찾을 수 있습니다. 아이디
orderBy 필드를 지정하지 않으면 문서가 docId의 오름차순으로 반환됩니다. 그리고 두 개 이상의 where 필드를 포함하는 경우 (복합) 인덱스를 생성해야 합니다. 여기서는 브라우저 검사 도구가 도움이 될 것입니다. "색인 필요" 오류 메시지에 있는 링크를 따라가기만 하면 됩니다. 개별 필드는 Firestore 데이터베이스에서 자동으로 색인이 생성됩니다.
컬렉션에 있는 모든 문서를 검색하려면:
const myCollRef = collection(db, "myCollectionName"); const myQuery = query(myCollRef); const mySnapshot = await getDocs(myQuery); mySnapshot.forEach((myDoc) => { console.log(myDoc.id, " >= ", myDoc.data()); });
Firestore 비교 연산자는 "==", ">"입니다. , "<", "<=", ">=" 및 "!=" 및 흥미로운 배열 멤버십 연산자.
컬렉션의 계층에 있는 모든 문서를 검색하고 그런 다음 다음 작업을 수행합니다.
다단계 컬렉션 계층 구조 처리가 완료된 후 특정 작업을 수행하려면 주의해야 합니다. 코드에 각각 wait 명령이 포함된 중첩된 foreach 문이 많이 포함되어 있는 경우 전체 세트가 완료되었을 때 알려주는 개별 wait에 의존할 수 없습니다. 각 개인이 기다리는 것은 별도의 스레드를 차지하며 도움이 되는 방식으로 서로 직접 통신하지 않습니다.
이 문제를 해결하는 한 가지 방법은 스냅샷에 forEachs 대신 기존 for 루프를 사용하는 것입니다. 다음은 작업을 수행하기 전에 하위 컬렉션의 모든 어린이를 대상으로 하는 예입니다
let myDocData = .... create an object containing your data item properties ..... const myCollRef = collection(db, "myCollectionName"); const myDocRef = doc(myCollRef); await setDoc(myDocRef, myDocData);
여기서 엄격한 순서에 따라 수행되는 대기를 신뢰할 수 있으며, 루프의 끝에 도달하면 자신 있게 종속 작업을 수행할 수 있다는 것을 알 수 있습니다. 그러나 이로 인해 발생하는 성능 저하가 클 수 있으므로 다음 배열에 관심이 있을 수 있습니다.
forEach 루프의 대기에 의해 시작된 개별 약속을 배열에 저장하여 처리할 수 있습니다. 그런 다음 이 배열에 wait Promise.all 명령을 적용하여 모든 멤버 약속이 언제 완료되는지 확인할 수 있습니다. 여기에서 모든 상황에 맞게 간단한 템플릿을 제공하는 것은 불가능하지만 다음은 광범위한 원칙을 보여주는 "스케치"입니다.
여기서 두 개의 별도 컬렉션(상위 및 하위)을 포함하는 2단계 계층 구조는 공통 parentId 필드로 연결됩니다. 집계 분석을 허용하기 위해 두 컬렉션을 메모리로 읽어옵니다. 모든 어린이가 책을 읽었을 때만 가능합니다.
let myDocData = .... create a data object ..... let myDocumentIdentifier = .... create your identifier .... const myDocRef = doc(db, "myCollectionName", myDocumentIdentifier) await setDoc(myDocRef, myDocData);
예 - 문서의 myDocData 콘텐츠에서 myField 속성 값을 변경하려면
const myDocRef = doc(db, "myCollectionName", myDocId); const myDoc = await getDoc(myDocRef); if (myDoc.exists()) { console.log("Document data:", myDoc.data()); }
예 - myDocId 문서의 전체 콘텐츠를 myField 속성만 포함하는 새 개체로 대체
const myCollRef = collection(db, "myCollectionName"); const myQuery = query(myCollRef, where("myField1Name", "==", myField1Value), orderBy("myField2Name", "asc")); const mySnapshot = await getDocs(myQuery); mySnapshot.forEach((myDoc) => { console.log(myDoc.id, " => ", myDoc.data()); });
위 예의 {myField: myFieldValue} 비트를 변경하려는 필드가 포함된 객체로 대체하여 여러 필드에 동시에 변경 사항을 적용할 수 있습니다.
const myCollRef = collection(db, "myCollectionName"); const myQuery = query(myCollRef); const mySnapshot = await getDocs(myQuery); mySnapshot.forEach((myDoc) => { console.log(myDoc.id, " >= ", myDoc.data()); });
트랜잭션 내부에서 위에 소개된 패턴은 변경되지 않지만 setDoc 명령은 다음과 같이 수정됩니다.
runTransaction(db, async (transaction) => { ... }).catch(); 내에서 기능:
위에서 언급했듯이 Google에서는 setDoc()과 동시에 문서 생성 및 업데이트를 위한 addDoc() 및 updateDoc() 함수를 제공합니다. 그러나 setDoc이 두 작업을 모두 수행할 수 있으면 이는 불필요하게 혼란스러워 보입니다. 또한 거래의 경우 addDoc()은 자동 ID가 있는 문서를 생성하는 데에만 사용할 수 있습니다. 실제로는 어디에서나 setDoc을 사용하는 것이 더 간단해 보입니다.
Firestore 문서 식별자를 생성하는 doc(myCollRef) 호출에는 wait가 없다는 것을 눈치채셨을 것입니다. 이는 Firestore가 실제로 컬렉션을 방문하거나 이미 사용 중인 항목을 확인하지 않고도 이 작업을 수행할 수 있음을 알려줍니다. 이를 어떻게 관리하는지 궁금하다면 StackOverflow의 토론을 확인해 보세요.
Cloud Firestore에 데이터 추가: https://firebase.google.com/docs/firestore/manage-data/add-data
Cloud Firestore로 데이터 읽기: https://firebase.google.com/docs/firestore/query-data/get-data
Cloud Firestore에서 데이터 삭제: https://firebase.google.com/docs/firestore/manage-data/delete-data
SDK 문서는 다음에서 찾을 수 있습니다.
위 내용은 NgSysV: Firestore CRUD 템플릿의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!