此貼文系列已在 NgateSystems.com 建立索引。您還可以在那裡找到超級有用的關鍵字搜尋工具。
最後評論:24 年 11 月
Google 提供的大量關於 Firestore CRUD(建立、讀取、更新、刪除)說明的線上文件對於日常使用來說可能過於詳細。以下是最重要的 Firestore 功能的範本。我建議您按原樣剪切並貼上它們,然後將變數名稱中的“my”一詞替換為您要定位的集合名稱的適當縮寫。例如,對名為“Lecture_events”的集合的引用可能會編碼為“lecEvtsCollRef”。
建立包含 myDocData 物件的文檔,該物件具有自動產生的 id:
let myDocData = .... create an object containing your data item properties ..... const myCollRef = collection(db, "myCollectionName"); const myDocRef = doc(myCollRef); await setDoc(myDocRef, myDocData);
請注意,令人困惑的是,關於「新增資料」的 Google 文件引用了 addDoc 函數作為 setDoc 的替代函數。請參閱下面的後記,了解為什麼 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。如果您只是想確定是否存在符合選擇條件的文檔,一個有用的技巧是檢查非零的 mySnapshot.size。
如果您想引用快照數組中的各個文檔,您可以在 mySnapshot.docs[n].data() 中找到第 n 個條目的數據,並在 mySnapshot.docs[n] 中找到其 id。 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 比較運算子為“==”、“>” 、“=”和“!=”,以及一些有趣的陣列成員運算符。
要檢索集合層次結構中的所有文檔,然後然後執行某些操作:
當您想要在對多層次集合層次結構的處理結束後執行特定操作時,必須小心。如果您的程式碼包含許多巢狀的 foreach 語句,每個語句都包含一個await 指令,則您不能依賴各個await 來告訴您整個集合何時完成。這些單獨的等待中的每一個都佔用一個單獨的線程,並且它們不會以任何有用的方式直接相互通信。
解決此問題的一種方法是在快照上使用傳統的 for 循環而不是 forEachs。這是一個在執行操作之前針對子集合中的所有子級的範例
let myDocData = .... create an object containing your data item properties ..... const myCollRef = collection(db, "myCollectionName"); const myDocRef = doc(myCollRef); await setDoc(myDocRef, myDocData);
在這裡,您可以依靠您的等待按照嚴格的順序執行,當您到達循環末尾時,您知道您可以自信地繼續執行您的相關操作。但由此造成的效能影響可能會很大,因此您可能對以下安排感興趣:
您可以透過將它們儲存在陣列中來取得 forEach 迴圈中等待啟動的各個承諾的句柄。然後,您可以對此數組套用await Promise.all 指令,以了解其所有成員promise 何時完成。這裡不可能提供一個適合所有情況的簡單模板,但以下是說明廣泛原則的「草圖」。
這裡,涉及兩個獨立集合(父集合和子集合)的兩級層次結構透過公共的parentsId 欄位連結。這兩個集合被讀入記憶體以允許對聚合進行分析。這只有在所有孩子都讀完後才能完成。
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 提供了 addDoc() 和 updateDoc() 函數,用於與 setDoc() 並行建立和更新文件。但當 setDoc 可以執行這兩種操作時,這似乎不必要地令人困惑。另外,當涉及到事務時,addDoc() 只能用於建立具有自動 ID 的文件。實際上,在任何地方使用 setDoc 似乎更簡單。
您可能已經注意到,在建立 Firestore 文件識別碼的 doc(myCollRef) 呼叫上沒有等待。這告訴您,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中文網其他相關文章!