首頁 >web前端 >js教程 >NgSysV:Firestore CRUD 模板

NgSysV:Firestore CRUD 模板

Linda Hamilton
Linda Hamilton原創
2024-12-04 05:31:15901瀏覽

NgSysV: Firestore CRUD templates

此貼文系列已在 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());
});

交易中的 CRUD 操作

在事務內部,上面介紹的模式保持不變,但 setDoc 指令修改如下:

在 runTransaction(db, async (transaction) => { ... }).catch(); 內部功能:

  • getDoc 被 transaction.get() 取代
  • setDoc 被 transaction.set() 取代
  • deleteDoc 被 transaction.delete() 取代

後記

  1. 如上所述,Google 提供了 addDoc() 和 updateDoc() 函數,用於與 setDoc() 並行建立和更新文件。但當 setDoc 可以執行這兩種操作時,這似乎不必要地令人困惑。另外,當涉及到事務時,addDoc() 只能用於建立具有自動 ID 的文件。實際上,在任何地方使用 setDoc 似乎更簡單。

  2. 您可能已經注意到,在建立 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 文件可以在以下位置找到:

  • https://firebase.google.com/docs/reference/js/firestore_ 和
  • https://firebase.google.com/docs/reference/js/firestore_.transaction

以上是NgSysV:Firestore CRUD 模板的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn