我正在使用 Firebase Firestore 來滿足我的資料需求。我有一個資料模型,其中有一組蘋果,每個檔案代表一個唯一的蘋果,該蘋果具有一個物件型別的欄位,該欄位本質上是 <string, string> 的映射
把每個蘋果檔案想象成這樣:
name: "SiberianApple",
weight: "400g"
color: {
today: "green",
yesterday: "red",
tomorrow: "crimson"
}
通過閱讀檔案,我了解到我們可以通過各種方式查詢集合,但是是否可以限制客戶端在獲取檔案時需要獲取的資訊量。我可以對這個欄位進行查詢color,以便它只回傳
name: "SiberianApple",
weight: "400g",
color: {
today: "green"
}
基本上類似于graphql,在那里我可以要求我想要的東西。想知道是否可以查詢或者這個欄位應該是這個檔案的子集合,以便我可以使用子集合的路徑查詢顏色apples/<appleId>/colors?
uj5u.com熱心網友回復:
Cloud Firestore 偵聽器在檔案級別觸發。無法僅通過檔案中的特定欄位觸發或拆分檔案以僅獲取一個屬性。它是整個檔案或什么都沒有。因此 Firestore 客戶端 SDK 始終回傳完整的檔案。不幸的是,無法僅請求檔案的一部分。
是否可以限制資訊量。
如前所述,這是不可能的。您可以做的是使用只能包含您需要的欄位的檔案創建另一個集合。這種做法稱為反規范化,在 NoSQL 資料庫中是一種很常見的做法。
uj5u.com熱心網友回復:
正如 Alex 在他的回答中所解釋的那樣,使用客戶端 SDK 不可能只獲取檔案欄位的子集。當你獲取一個 Document 時,你會得到它的所有欄位。
但是,這可以通過Firestore REST API 實作:使用 REST API,您可以在使用DocumentMask該get方法獲取一個檔案時使用 a 。在DocumentMask 將“限制檔案上的GET操作其欄位的子集”。
對于查詢多個檔案,它有點不同:您使用該runQuery方法。請求正文應包含一個具有structuredQuery屬性的 JSON 物件。
反過來,StructuredQuery具有select包含Projection物件的屬性。
這是呼叫runQuery方法時使用的有效載荷示例(即https://firestore.googleapis.com/v1/{parent=projects/*/databases/*/documents}:runQuery):
const payloadObj = {
structuredQuery: {
where: {
// ....
},
orderBy: [
{
field: {
fieldPath: 'name',
},
direction: 'ASCENDING',
},
],
from: [
{
collectionId: 'apples',
},
],
select: {
fields: [
{
fieldPath: 'name',
},
{
fieldPath: 'weight',
},
{
fieldPath: 'color.today',
},
],
},
limit: 1000,
},
};
正如你在上面的代碼中看到的,你只能定位color地圖的一個屬性,用fieldPath: 'color.today',
尾注:REST API 的用戶友好性不如客戶端 SDK,因為您需要構建傳遞給請求的有效負載并決議回應,但它并不難使用。在一個web應用程式,使用fetch,axios或gaxios執行呼叫。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/322657.html
標籤:javascript 火力基地 网络 谷歌云firestore
上一篇:db.collection不是函式firebasefirestore
下一篇:JSON中的層次結構
